You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Emscripten/CMake编译WebGL应用遇‘no input files’错误求助

Emscripten编译WebGL应用时链接阶段出现"em++: no input files"错误

问题背景

尝试用Emscripten将WebGL应用编译为WASM,所有源文件编译正常,但链接生成最终WASM时报错em++: error: no input files。

CMake配置文件

cmake_minimum_required(VERSION 3.10)
include(CMakePrintHelpers)

project(webgl_demo C CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_C_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON)

set(CMAKE_BUILD_TYPE Release)

set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output)

set(CGLM_SHARED OFF CACHE BOOL "" FORCE)
set(CGLM_STATIC ON CACHE BOOL "" FORCE)
set(CGLM_USE_C99 ON CACHE BOOL "" FORCE)
set(CGLM_USE_TEST OFF CACHE BOOL "" FORCE)

set(ASSIMP_BUILD_ZLIB OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_NO_EXPORT ON CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT OFF CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_FBX_IMPORTER ON CACHE BOOL "" FORCE)

set(OVERRIDE_CXX_FLAGS ON CACHE BOOL "" FORCE)
set(OVERRIDE_C_FLAGS ON CACHE BOOL "" FORCE)

set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_C_FLAGS_RELEASE "-O3")

add_subdirectory(third_party/cglm)
add_subdirectory(third_party/assimp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/cglm/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/glfw/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/opengl/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/stb)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/assimp/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/build/third_party/assimp/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/third_party/freetype)

FILE(GLOB_RECURSE MY_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")

cmake_print_variables(MY_SOURCES)

add_executable(
webgl_demo
${MY_SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/third_party/opengl/src/glad.c
)

set_target_properties(webgl_demo PROPERTIES LINK_FLAGS "-s USE_WEBGL2=1 -s USE_GLFW=3 -s USE_FREETYPE=1 -s USE_ZLIB=1
-s ALLOW_MEMORY_GROWTH=1 -s BINARYEN_ASYNC_COMPILATION=1 -s WASM=1")

target_link_libraries(webgl_demo cglm assimp)

编译命令

mkdir build
cd build
emcmake cmake ..
emmake make

错误日志

...
[ 94%] Building C object CMakeFiles/webgl_demo.dir/src/core/skybox.c.o
[ 94%] Building C object CMakeFiles/webgl_demo.dir/src/core/snoise.c.o
[ 95%] Building C object CMakeFiles/webgl_demo.dir/src/core/texture.c.o
[ 95%] Building C object CMakeFiles/webgl_demo.dir/src/core/timing.c.o
[ 96%] Building C object CMakeFiles/webgl_demo.dir/src/core/water.c.o
[ 97%] Building C object CMakeFiles/webgl_demo.dir/src/core/window.c.o
[ 97%] Building C object CMakeFiles/webgl_demo.dir/src/core/world_batch.c.o
[ 98%] Building C object CMakeFiles/webgl_demo.dir/src/core/world_instanced.c.o
[ 98%] Building C object CMakeFiles/webgl_demo.dir/src/main.c.o
[ 99%] Building C object CMakeFiles/webgl_demo.dir/third_party/opengl/src/glad.c.o
[100%] Linking CXX executable "C:\_Projects_\2-Game Projects\webgl_demo\output\webgl_demo.js"
em++: error: no input files
mingw32-make.EXE[2]: *** [C:/_Projects_/2-Game Projects/webgl_demo/output/webgl_demo.js] Error 1
mingw32-make.EXE[1]: *** [CMakeFiles/webgl_demo.dir/all] Error 2
C:\mingw\bin\mingw32-make.EXE: *** [all] Error 2
emmake: error: 'C:\mingw\bin\mingw32-make.EXE' failed (returned 2)

环境信息

emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.56 (cf90417346b78455089e64eb909d71d091ecc055)
clang version 19.0.0git (https:/github.com/llvm/llvm-project 34ba90745fa55777436a2429a51a3799c83c6d4c)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: C:\_Projects_\2-Game Projects\emsdk\upstream\bin

解决方案

当前LINK_FLAGS设置存在换行,CMake解析时会将参数拆分,导致Emscripten链接器无法正确识别输入文件。将链接参数合并为一行:

set_target_properties(webgl_demo PROPERTIES LINK_FLAGS "-s USE_WEBGL2=1 -s USE_GLFW=3 -s USE_FREETYPE=1 -s USE_ZLIB=1 -s ALLOW_MEMORY_GROWTH=1 -s BINARYEN_ASYNC_COMPILATION=1 -s WASM=1")

2. 避免依赖GLOB_RECURSE获取源文件

GLOB_RECURSE可能在跨平台或CMake重新配置时遗漏文件,建议显式列出源文件,或通过cmake_print_variables(MY_SOURCES)的输出确认MY_SOURCES是否包含所有必要文件。

3. 处理含空格的路径

项目路径包含空格(2-Game Projects),可能导致链接器解析路径出错。可将项目迁移到无空格的路径下,或用引号包裹输出目录路径:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/output")

4. 确认Emscripten工具链配置

运行emcmake cmake ..后,检查CMakeCache.txt中的CMAKE_C_COMPILER和CMAKE_CXX_COMPILER是否指向Emscripten的emcc和em++,避免混用本地MinGW工具链。

5. 移除OVERRIDE_CXX_FLAGS和OVERRIDE_C_FLAGS

这两个选项会覆盖Emscripten默认编译标志,可能导致链接异常,注释或删除以下两行:

# set(OVERRIDE_CXX_FLAGS ON CACHE BOOL "" FORCE)
# set(OVERRIDE_C_FLAGS ON CACHE BOOL "" FORCE)

内容的提问来源于stack exchange,提问作者Şükrü Çiriş

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:25:55