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

9
我想使用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 始终 存在,因此无需进行跨平台检查。 - cajomar
2个回答

12

我根据这个页面这个页面这个页面解决了问题:

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})

使用 emcmake cmake . && make 编译该项目需要 emscripten 工具链,也可以使用常规的 cmake . && make 命令进行编译。


4

我利用以下方法欺骗emcc来安装zlib端口:

emcc -s USE_ZLIB=1 $(mktemp)

使用emcmake cmake ..已经开始对我起作用了。我敢打赌你应该也可以用SDL完成相同的工作。


1
我认为 embuilder build zlib 是官方的做法。 - HolyBlackCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接