使用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
解决方案
1. 修复LINK_FLAGS中的换行问题
当前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ş
相关产品推荐
相关产品推荐

