首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMakeList文件中的Emscripten - cmake - pass emscripten选项

CMakeList文件中的Emscripten - cmake - pass emscripten选项
EN

Stack Overflow用户
提问于 2017-07-23 07:29:55
回答 2查看 10.4K关注 0票数 17

如何使用emcmake cmake和传递嵌入命令行选项?

对c++ / CMake非常陌生,但在谷歌上找不到任何有用的东西。因此,也许这个问题太愚蠢了,在这种情况下,我道歉。

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

代码语言:javascript
复制
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)

而对于web(组装)

代码语言:javascript
复制
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)的副本

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

代码语言:javascript
复制
error: no such file or directory: 'SAFE_HEAP=1'

所以真的..。emcmake是如何工作的,如果不是,我如何在CMakeList文件中传递emscripten参数?

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2017-07-24 18:11:51

我知道我做错了什么..

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

无论如何,事实证明我不需要emcmake,只需从三进制调用cmake就行了,就像这样的->

代码语言:javascript
复制
cmake -DCMAKE_BUILD_TYPE=Debug -G \"Unix Makefiles\" -DCMAKE_TOOLCHAIN_FILE=/emscripten/emscripten/incoming/cmake/Modules/Platform/Emscripten.cmake . && make

这是我最后的CMakeList.txt

代码语言:javascript
复制
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 .)
票数 19
EN

Stack Overflow用户

发布于 2019-01-27 17:18:27

我认为问题是你覆盖了CMAKE_MODULE_PATH,它也是配置的。尝试将该行替换为:

代码语言:javascript
复制
list(APPEND CMAKE_MODULE_PATH <yourstuff>)

然后你只需要做"emcmake cmake“和"emmake make",它应该可以正常工作。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45260216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档