如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)

Posted

技术标签:

【中文标题】如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)【英文标题】:How to use emscripten ports (SDL2 and Freetype) with cmake 【发布时间】:2020-08-18 18:40:55 【问题描述】:

我正在尝试使用 CMake 将 C++ 项目编译为 webassembly。我正在使用 emscripten,我想将 emscripten 端口用于 SDL2 和 Freetype。通常,使用 emcc 编译时,您将使用标志:-USE_SDL=2 和 -USE_FREETYPE=1,以包含这些端口。但是我不知道如何使用 CMake 来实现这一点。

这是我的 CMakeList 文件:


cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall -Wextra")

find_package(SDL2 REQUIRED)
find_package(Freetype REQUIRED)
include_directories($CMAKE_SOURCE_DIR/include $SDL2_INCLUDE_DIRS $FREETYPE_INCLUDE_DIRS)

add_executable(project src/main.cpp src/glad.c src/Game.cpp src/Block.cpp include/jumpyblock/Block.h)
target_link_libraries(project $SDL2_LIBRARIES $FREETYPE_LIBRARIES)

使用常规 cmake 编译并成功运行。

到目前为止,我已经尝试使用emcmake cmake . && make 进行编译,它给了我一个错误,说它找不到 SDL2 的包配置文件。

我已经尝试修改 CMakeList 文件以使用端口的 emcc 标志:


cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall -Wextra -USE_SDL=2 -USE_FREETYPE=1")

include_directories($CMAKE_SOURCE_DIR/include $SDL2_INCLUDE_DIRS $FREETYPE_INCLUDE_DIRS)

add_executable(project src/main.cpp src/glad.c src/Game.cpp src/Block.cpp include/jumpyblock/Block.h )
target_link_libraries(project $SDL2_LIBRARIES $FREETYPE_LIBRARIES)

有了这个 cmake 文件,emcmake cmake . 运行成功,但随后make 抱怨它找不到'SDL2/SDL.h'。

任何帮助将不胜感激。

【问题讨论】:

只做target_link_libraries(project SDL2 freetype) 应该可以。在 Emscripten freetype 和 sdl2 的情况下,将始终在那里,因此不需要跨平台检查。 【参考方案1】:

我根据此页面修复了问题:https://github.com/emscripten-core/emscripten/issues/9259,

本页:Generate Web Assembly from CMake Project with a Specified html Output,

这个页面:Emscripten - cmake - pass emscripten options in CMakeList file

<pre><code>
cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -Wall -Wextra")

if( $CMAKE_SYSTEM_NAME MATCHES "Emscripten")
    set(USE_FLAGS "-s USE_SDL=2 -s USE_FREETYPE=1")
    set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS $USE_FLAGS")
    set(CMAKE_C_FLAGS "$CMAKE_C_FLAGS $USE_FLAGS")
    set(CMAKE_EXE_LINKER_FLAGS "$CMAKE_EXE_LINKER_FLAGS $USE_FLAGS")
    set(CMAKE_EXECUTABLE_SUFFIX .html)
else()
    find_package(SDL2 REQUIRED)
    find_package(Freetype REQUIRED)
endif()
include_directories($CMAKE_SOURCE_DIR/include $SDL2_INCLUDE_DIRS $FREETYPE_INCLUDE_DIRS)

add_executable(project src/main.cpp src/glad.c src/Game.cpp src/Block.cpp include/jumpyblock/Block.h)
target_link_libraries(project $SDL2_LIBRARIES $FREETYPE_LIBRARIES)
</code></pre>

这使用 emscripten 编译,使用 emcmake cmake . &amp;&amp; make 并定期使用 cmake . &amp;&amp; make

【讨论】:

【参考方案2】:

我用这个欺骗emcc 安装 zlib 端口:

emcc -s USE_ZLIB=1 $(mktemp)

emcmake cmake .. 开始为我工作。我敢打赌,您应该能够对 SDL 做同样的事情。

【讨论】:

以上是关于如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 emscripten 与 cmake 一起用于项目依赖项?

如何让 JetBrains CLion 中的“cmake”工作来编译 Emscripten/WebAssembly?

emscripten 和 CMake 库的放置位置

CMake可以生成配置文件吗?

OpenCV Find_Package Emscripten - WebAssembly

如何阻止CMake将特定于平台的标志传递给编译器?