Emscripten构建失败排查:npm run build编译Wasm出错求助
初始构建错误
执行npm run build通过Emscripten构建Wasm时,配置阶段失败,报错如下:
configure: make -DCMAKE_TOOLCHAIN_FILE=/usr/share/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/usr/bin/node;--experimental-wasm-threads
make: invalid option -- 'D'
make: invalid option -- 'D'
最终错误信息:
This program built for x86_64-pc-linux-gnu
Report bugs to bug-make@gnu.org
emcmake: error: 'make -DCMAKE_TOOLCHAIN_FILE=/usr/share/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/usr/bin/node;--experimental-wasm-threads' failed (returned 2)
make: *** [Makefile:84: build/popt/.libs/libpopt.a] Error 1
更新后的错误
改用cmake替代make后,出现新错误:
configure: cmake -DCMAKE_TOOLCHAIN_FILE=/home/user1/Downloads/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/home/user1/Downloads/emsdk/node/14.18.2_64bit/bin/node;--experimental-wasm-threads
CMake Warning:
No source or binary directory provided. Both will be assumed to be the same as the current working directory, but note that this warning will become a fatal error in future CMake releases.CMake Error: The source directory "/home/user1/Downloads/test1.js-master/build/popt" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
emcmake: error: 'cmake -DCMAKE_TOOLCHAIN_FILE=/home/user1/Downloads/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/home/user1/Downloads/emsdk/node/14.18.2_64bit/bin/node;--experimental-wasm-threads' failed (returned 1)
make: *** [Makefile:84: build/popt/.libs/libpopt.a] Error 1
问题分析与解决思路
初始错误原因
-D是CMake专属参数,Make命令无法识别。构建脚本错误地将CMake参数传给了Make,导致直接报错。
更新后错误的原因
- 项目构建系统不匹配:popt库是基于Autotools(Makefile.am/configure.ac)的项目,没有CMake配置文件
CMakeLists.txt,直接用CMake命令初始化构建必然失败。 - 参数格式错误:
CMAKE_CROSSCOMPILING_EMULATOR的值中用分号;分隔node和参数,这是CMake的列表语法,但在命令行中,分号会被shell解析为命令分隔符,导致参数传递混乱。
正确解决步骤
- 适配popt的构建系统:使用Emscripten提供的
emconfigure和emmake包装popt的Autotools构建命令,示例:emconfigure ./configure --host=asmjs-unknown-emscripten emmake make - 修正模拟器参数格式:如果需要指定带参数的node作为模拟器,需将整个命令用引号包裹,避免shell解析错误,示例:
-DCMAKE_CROSSCOMPILING_EMULATOR="/usr/bin/node --experimental-wasm-threads" - 检查构建脚本:查看
npm run build对应的脚本内容,修正其中错误的命令调用逻辑,确保不同构建系统的项目使用对应的Emscripten包装工具。
内容的提问来源于stack exchange,提问作者dave88

