使用 emscripten/cmake 编译 webgl 应用程序时出现“无输入文件”错误

问题描述 投票:0回答:1

我正在尝试使用 emscripten 将我的 webgl 应用程序编译为 wasm。这是我的 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

它编译我的所有源文件没有问题,但是当它链接并生成最终的 wasm 文件时,它给出了这个错误:

...
...
...
[ 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)

这是我的 emscripten 版本:

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

我该如何解决这个问题?

我尝试更改一些编译参数、cmake 文件中的注释链接等。但我无法修复它。这是我第一次使用 emscripten,所以我不知道该怎么做。

c++ c cmake emscripten
1个回答
0
投票

“em++:错误:没有输入文件”通常发生在链接器找不到任何输入文件来创建最终可执行文件或输出时。它似乎发生在生成最终输出时的链接阶段。

似乎

add_executable
调用未正确指定源文件。仔细检查您的
MY_SOURCES
变量。确保
${CMAKE_CURRENT_SOURCE_DIR}/third_party/opengl/src/glad.c
也可用。确保
FILE(GLOB_RECURSE MY_SOURCES ...)
路径中没有错误或拼写错误(路径中不要保留空格,请使用 _ 代替)。

如果仍然遇到问题,您可能需要明确列出所有源文件,而不是使用

FILE(GLOB_RECURSE MY_SOURCES ...)
,而是使用
FILE(GLOB ...)
FILE(GLOB_RECURSE ...)
。它可以自动拾取新文件,有时可能会导致意外行为,特别是当您有大型代码库或复杂结构时。

您可以尝试像这样使用

FILE(GLOB_RECURSE ...)

set(MY_SOURCES
    src/core/file1.c
    src/core/file2.c
    src/main.c
    third_party/opengl/src/glad.c
    # Add all source files here
)

add_executable(
    webgl_demo
    ${MY_SOURCES}
)
© www.soinside.com 2019 - 2024. All rights reserved.