Интегрируйте Emscripten в Clion

Недавно я работаю над проектом, который включает использование Emscripten. Я могу установить и запустить несколько примеров на терминале, но я хочу интегрировать его с Clion, чтобы я мог напрямую включить emscripten в свой основной проект и построить его. Я попытался добавить каталог в CMakeList, но при сборке возникли ошибки. Может ли кто-нибудь помочь мне найти подходящий способ интеграции Emscripten в Clion или любое предложение о том, что включить в CMakeList. Любая помощь будет оценена по достоинству. Спасибо за ваше драгоценное время.

Я включил эти строки в CMakeList моего демонстрационного проекта:

cmake_minimum_required(VERSION 3.12)

project(projectShell)

set(CMAKE_CXX_STANDARD 14)
if (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
set(CMAKE_C_COMPILER "emcc")
endif ()
include_directories(include/rapidjson)
include_directories(/home/myfastcomp/emscripten/emscripten/system/include 
)
add_executable(projectShell main.cpp library.cpp library.h)
if (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
set_target_properties(projectShell PROPERTIES LINK_FLAGS "-o 
dist/projectShell.js -s USE_FREETYPE=1 -s DISABLE_EXCEPTION_CATCHING=0 -s DEMANGLE_SUPPORT=1 -s SAFE_HEAP=1 --bind -s WASM=1 -O2 -s LEGACY_GL_EMULATION=0  -s GL_UNSAFE_OPTS=0 --pre-js pre-module.js --post-js post-module.js -s ASSERTIONS=1 -s GL_ASSERTIONS=1 -s INVOKE_RUN=0  -std=c++11 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3 -s OFFSCREENCANVAS_SUPPORT=1 --preload-file textures --preload-file shaders --preload-file fonts")
endif ()

Вот ошибки:

In file included from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_config.h:45:0,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_stdinc.h:31,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_main.h:25,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL.h:72,
             from /home/myfastcomp/emscripten/emscripten/system/include/emscripten/emscripten.h:27,
             from /home/myfastcomp/emscripten/emscripten/system/include/emscripten.h:1,
             from /home/CLionProjects/projectShell/library.h:8,
             from /home/CLionProjects/projectShell/library.cpp:5:
             /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_config_minimal.h:3 7:22: error: conflicting declaration ‘typedef unsigned int size_t’
             typedef unsigned int size_t;
                  ^~~~~~
             In file included from /usr/include/stdio.h:33:0,
             from /home/myfastcomp/emscripten/emscripten/system/include/emscripten/emscripten.h:24,
             from /home/myfastcomp/emscripten/emscripten/system/include/emscripten.h:1,
             from /home/CLionProjects/projectShell/library.h:8,
             from /home/CLionProjects/projectShell/library.cpp:5:
             /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h:216:23: note: previous declaration as ‘typedef long unsigned int size_t’
             typedef __SIZE_TYPE__ size_t;
                   ^~~~~~
             In file included from /usr/include/x86_64-linux-gnu/sys/types.h:156:0,
             from /usr/include/stdlib.h:394,
             from /usr/include/c++/7/cstdlib:75,
             from /usr/include/c++/7/stdlib.h:36,
             from /usr/lib/gcc/x86_64-linux-gnu/7/include/mm_malloc.h:27,
             from /usr/lib/gcc/x86_64-linux-gnu/7/include/xmmintrin.h:34,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_cpuinfo.h:59,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL.h:78,
             from /home/myfastcomp/emscripten/emscripten/system/include/emscripten/emscripten.h:27,
             from /home/hottab/myfastcomp/emscripten/emscripten/system/include/emscripten.h:1,
             from /home/CLionProjects/projectShell/library.h:8,
             from /home/CLionProjects/projectShell/library.cpp:5:
             /usr/include/x86_64-linux-gnu/bits/stdint-intn.h:27:19: error: conflicting declaration ‘typedef __int64_t int64_t’
              typedef __int64_t int64_t;
               ^~~~~~~
              In file included from 
              /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_config.h:45:0,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_stdinc.h:31,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL_main.h:25,
             from /home/myfastcomp/emscripten/emscripten/system/include/SDL/SDL.h:72,
             from /home/myfastcomp/emscripten/emscripten/
             system/include/emscripten/emscripten.h:27,
             from /home/myfastcomp/emscripten/emscripten/
             system/include/emscripten.h:1,
             from /home/CLionProjects/projectShell/library.h:8,
             from /home/CLionProjects/projectShell/library.cpp:5:
             /home/myfastcomp/emscripten/
             emscripten/system/include/SDL/SDL_config_minimal.h:44:26: 
             note: previous declaration as ‘typedef long long int 
              int64_t’
              typedef signed long long int64_t;
                      ^~~~~~~
              In file included from 
              /home/myfastcomp/emscripten/emscripten/
              system/include/emscripten.h:1:0,
             from /home/CLionProjects/projectShell/library.h:8,
             from /home/CLionProjects/projectShell/library.cpp:5:
             /home/myfastcomp/emscripten/emscripten/
             system/include/emscripten/emscripten.h:135:194: error: 
             wrong number of arguments specified for ‘deprecated’ 
              attribute
             void emscripten_set_canvas_size(int width, int height) 
             __attribute__((deprecated("This variant does not allow 
              specifying the target canvas", "Use 
              emscripten_set_canvas_element_size() instead")));

              ^
              /home/myfastcomp/emscripten/emscripten/
              system/include/emscripten/emscripten.h:136:254: error: 
              wrong number of arguments specified for ‘deprecated’ attribute
              void emscripten_get_canvas_size(int *width, int *height, 
              int *isFullscreen) __attribute__((deprecated("This 
               variant does not allow specifying the target canvas", 
               "Use emscripten_get_canvas_element_size() and 
                emscripten_get_fullscreen_status() instead")));

                  ^
               CMakeFiles/projectShell.dir/build.make:75: recipe for 
               target 'CMakeFiles/projectShell.dir/library.cpp.o' 
               failed
               make[3]: *** 
              [CMakeFiles/projectShell.dir/library.cpp.o] Error 1
               make[3]: *** Waiting for unfinished jobs....
               CMakeFiles/Makefile2:72: recipe for target 
              'CMakeFiles/projectShell.dir/all' failed
               make[2]: *** [CMakeFiles/projectShell.dir/all] Error 2
               CMakeFiles/Makefile2:84: recipe for target 
              'CMakeFiles/projectShell.dir/rule' failed
               make[1]: *** [CMakeFiles/projectShell.dir/rule] Error 2
               Makefile:118: recipe for target 'projectShell' failed
               make: *** [projectShell] Error 2

Вы проверили этот ответ? stackoverflow.com/questions/45260216/…

HugoTeixeira 16.08.2018 05:36

Да, я пробовал это, и при создании я получаю ошибки, такие как конфликтующее объявление, отсутствие бинарного оператора перед токеном и многое другое, что указывает на неправильную конфигурацию CMakeList.

Bishal Sahoo 16.08.2018 05:53

"при строительстве есть ошибки" ... что это за ошибки? Без вывода мы можем только догадываться. Может вы пропустили ссылку на библиотеку?

Stanley F. 16.08.2018 07:10

Простите за это. Я обновил, пожалуйста, посмотрите

Bishal Sahoo 16.08.2018 07:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
1 353
3

Ответы 3

CLion плохо понимает концепции команд emcmake и emmake. На данный момент лучше всего запустить это с терминала.

Теоретически должна быть возможность не использовать команду emcmake и настроить параметры CMake CLion для использования файла cmake инструментальной цепочки, специфичного для emscripten, но по какой-то причине это не работает.

Вы можете скомпилировать с помощью emscripten, создав инструментальную цепочку, установив правильные переменные среды и установив параметры компиляции.

В Сборка, выполнение, развертывание> Цепочки инструментов добавьте новую системную цепочку инструментов и назовите ее Emscripten со следующими параметрами:

  • CMake: без изменений
  • Марка: Без изменений
  • Компилятор C: путь к emcc
  • Компилятор C++: путь к em ++
  • Отладчик: без изменений

Затем в Сборка, выполнение, развертывание> CMake добавьте новый профиль, например Debug-Emscripten. Выберите Emscripten Toolchain. Вам нужно будет установить параметры CMake и переменные среды, которые добавляет emcmake. Вы можете увидеть параметры, установив переменную среды EM_BUILD_VERBOSE=3, однако, чтобы увидеть среду, в которой вам нужно покопаться в исходном коде emscripten (/usr/lib/emscripten/tools/shared.py на моей машине в функции get_building_env).

Параметры CMake для добавления:

  • -DCMAKE_CROSSCOMPILING_EMULATOR=path/to/node
  • -DCMAKE_TOOLCHAIN_FILE=path/to/cmake/Modules/Platform/Emscripten.cmake

Переменные среды, которые мне пришлось добавить на свой компьютер, были:

  • CC=path/to/emscripten/emcc
  • CXX=path/to/emscripten/em++
  • AR=path/to/emscripten/emar
  • LD=path/to/emscripten/emcc
  • NM=path/to/emscripten-llvm/llvm-nm
  • LDSHARED=path/to/emscripten/emcc
  • RANLIB=path/to/emscripten/emranlib
  • EMMAKEN_COMPILER=path/to/emscripten-llvm/clang++
  • EMSCRIPTEN_TOOLS=path/to/emscripten/tools
  • HOST_CC=path/to/emscripten-llvm/clang
  • HOST_CXX=path/to/emscripten-llvm/clang++
  • HOST_CFLAGS=-W
  • HOST_CXXFLAGS=-W
  • PKG_CONFIG_LIBDIR=path/to/emscripten/system/local/lib/pkgconfig:path/to/emscripten/system/lib/pkgconfig
  • PKG_CONFIG_PATH=
  • EMSCRIPTEN=path/to/emscripten
  • CROSS_COMPILE=path/to/emscripten/em

Теперь вы можете скомпилировать, выбрав конфигурацию Debug-Emscripten.

Но я исправил это с помощью инструментария MSYS2 в Windows 10.

Rualark 02.02.2020 12:43

Я установил набор инструментов для emscripten в настройках-> build-> cmake с -DCMAKE_TOOLCHAIN_FILE=..../sdks/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake

В проекте cmake я привязываю исходник к исполняемому файлу. Для флагов компиляции я использую params.

 set(CMAKE_EXECUTABLE_SUFFIX ".js")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s NO_EXIT_RUNTIME=1 -s 
    EXTRA_EXPORTED_RUNTIME_METHODS=['callMain']")

Другие вопросы по теме