【问题标题】:Emscripten - cmake - pass emscripten options in CMakeList fileEmscripten - cmake - 在 CMakeList 文件中传递 emscripten 选项
【发布时间】:2017-12-28 20:05:09
【问题描述】:

如何使用emcmake cmake并传递emscripten命令行选项?

对 c++/CMake 很陌生,但在 google 上找不到任何有用的东西。所以也许这个问题太愚蠢了,在这种情况下我道歉。

我可以使用以下 CMakeList.txt 文件构建我的项目(非 webassembly/普通桌面)

cmake_minimum_required(VERSION 3.7)
project(Engine)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
set(CMAKE_INCLUDE_PATH /usr/local/include)
set(SOURCE_FILES main.cpp src/Background.cpp src/Background.h src/Camera.cpp src/Chart.cpp src/Chart.h src/logger.cpp src/Engine.cpp src/Engine.h src/GL.cpp src/GL.h src/Instrument.cpp src/Instrument.h)
set(EMCC_LINKER_FLAGS "-s SAFE_HEAP=1 --bind -s WASM=1 -O3 -o ../index.js -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 shaders --preload-file extern --use-preload-plugins")
set(CMAKE_REQUIRED_FLAGS "${EMCC_LINKER_FLAGS}")

find_package(OPENGL REQUIRED)
find_package(GLEW REQUIRED)
#find_package(SDL2 REQUIRED)
find_package(glfw3 REQUIRED)
find_package(assimp REQUIRED)
find_package(Freetype REQUIRED)

include_directories(/emscripten/ /emscripten/emscripten/incoming/system/include)
include_directories(/usr/local/include)
include_directories(${FREETYPE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ${GLFW_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR})

#add_subdirectory(shaders)

add_executable(Engine ${SOURCE_FILES} extern/stb_image.cpp src/Camera.h src/Cubes.cpp src/Chart.cpp)

target_link_libraries(Engine ${FREETYPE_LIBRARIES} ${OPENGL_gl_LIBRARY} ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARIES} ${SDL2_TTF_LIBRARIES} ${GLEW_LIBRARIES} glfw assimp)
#
#file(GLOB shaders/**/*.glsl shaders/*.glsl)

file(INSTALL shaders DESTINATION .)
file(INSTALL textures DESTINATION .)
#set(CMAKE_EXE_LINKER_FLAGS "${EMCC_LINKER_FLAGS}")
#SET_TARGET_PROPERTIES(Engine PROPERTIES LINK_FLAGS "-s SAFE_HEAP=1")
# add extra lib directories
#link_directories(/usr/local/lib)

对于网络(程序集)

emcc main.cpp ./src/*.cpp ./extern/*.cpp -o dist/engine.js -g  -s DISABLE_EXCEPTION_CATCHING=0 -s TOTAL_MEMORY=33554432  -s DEMANGLE_SUPPORT=1 -s SAFE_HEAP=1 --bind -s WASM=1 -Os -s LEGACY_GL_EMULATION=0  -s GL_UNSAFE_OPTS=0 --pre-js pre-module.js --post-js post-module.js -s ASSERTIONS=2 -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 extern --use-preload-plugins 

但是是否可以使用emcmake cmake 并将其全部保存在(单个)CMakeList 文件中?如果我执行emcmake cmake && make,它会快速生成一个文件,但它和空文件一样好(丢失所有文件)。

这可能归结为如何在 CMakeFile 中将参数传递给 emscripten 我猜...

CMake project for EmscriptenIssue specifying option while using Emscripten (Emcmake) 的重复

但设置SET_TARGET_PROPERTIES(Engine PROPERTIES LINK_FLAGS "-s SAFE_HEAP=1") 只给出以下类型的错误:

error: no such file or directory: 'SAFE_HEAP=1'

真的.. 我对 emcmake 的工作方式有误吗?如果没有,我该如何在 CMakeList 文件中传递 emscripten 参数?

非常感谢!

【问题讨论】:

    标签: c++ cmake emscripten webassembly


    【解决方案1】:

    我认为问题在于您正在覆盖 CMAKE_MODULE_PATH,emcmake 也配置了该路径。尝试将行替换为:

    list(APPEND CMAKE_MODULE_PATH <yourstuff>)
    

    那么你只需要“emcmake cmake”和“emmake make”,它应该可以正常工作了。

    在 cmake 文件中,您可以使用 "if (EMSCRIPTEN)" 来调整 suff 仅针对 emscripten 情况,例如编译器或链接器标志

    【讨论】:

      【解决方案2】:

      好吧,我知道我做错了什么..

      作为 Emscripten / CMake 的菜鸟,我没有意识到 emcmake 不会自动使用 emscripten 基本 cmake 文件(如果我运行特殊的 emscripten emcmake 命令,我会期待......)

      无论如何,事实证明我不需要 emcmake 并且可以像这样从终端调用 cmake ->

      cmake -DCMAKE_BUILD_TYPE=Debug -G \"Unix Makefiles\" -DCMAKE_TOOLCHAIN_FILE=/emscripten/emscripten/incoming/cmake/Modules/Platform/Emscripten.cmake . && make
      

      这是我最后的 CMakeList.txt

      cmake_minimum_required(VERSION 3.7)
      project(Engine)
      
      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dist)
      SET(CMAKE_BUILD_TYPE_INIT "Release")
      set(CMAKE_CXX_STANDARD 11)
      
      if (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
          set(CMAKE_C_COMPILER "emcc")
      endif ()
      
      set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
      set(SOURCE_FILES main.cpp src/Background.cpp src/Background.h src/Camera.cpp src/Chart.cpp src/Chart.h src/logger.cpp src/Engine.cpp src/Engine.h src/GL.cpp src/GL.h src/Instrument.cpp src/Instrument.h src/Text.cpp src/Text.h)
      
      find_package(OPENGL REQUIRED)
      
      if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
          find_package(GLEW REQUIRED)
          find_package(glfw3 REQUIRED)
          find_package(assimp REQUIRED)
          find_package(freetype REQUIRED)
      endif ()
      
      include_directories(
              /emscripten/
              /emscripten/emscripten/incoming/system/include
              /opt/X11/include/freetype2
              /usr/local/Cellar/freetype/2.8/include/freetype2
              ${FREETYPE_INCLUDE_DIRS}
              ${OPENGL_INCLUDE_DIR}
      )
      
      if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
          include_directories(${GLEW_INCLUDE_DIR})
      endif ()
      
      add_executable(Engine ${SOURCE_FILES} extern/stb_image.cpp src/Camera.h src/Cubes.cpp src/Chart.cpp)
      
      target_link_libraries(Engine ${OPENGL_gl_LIBRARY})
      
      if (${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
          set_target_properties(Engine PROPERTIES LINK_FLAGS "-o dist/engine.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")
      
      else ()
          target_link_libraries(Engine glfw glew)
      endif ()
      
      file(INSTALL shaders DESTINATION .)
      file(INSTALL textures DESTINATION .)
      

      【讨论】:

      • 感谢分享您的解决方案!出于某种原因,只有在我将“-std=c++11 -s WASM=1”放入 CMAKE_CXX_FLAGS,而不是 PROPERTIES LINK_FLAGS 之后,这种方法才对我有用(在 osx 上)
      • 很高兴为您提供帮助!自从我发布这个问题以来,我一直很忙,所以如果你遇到另一个 Emscripten / CMAKE 问题,请告诉我!
      • 那么我做对了吗?运行此代码后应该得到编译代码。在 WASM 扩展或 JS 中?
      • 谢谢你,它帮助我用我的 cmake 构建预加载了一个文件系统。我仍然无法输出带有“-o file.html”的html文件。它似乎不适用于 PROPERTIES LINK_FLAGS。
      • @Thomas 我已经知道如何输出 html。添加 set(CMAKE_EXECUTABLE_SUFFIX ".html") 似乎可以解决问题
      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多