emscripten的cmake无法生成build文件
之前换了硬盘后,把C盘的WebAssembly项目文件夹移到D盘上来,build的时候发现路径错了,就试着用emcmake cmake ..\..\src -G Ninja
来重新构建一下,结果构建报错了
CMake Error at CMakeLists.txt:4 (PROJECT):
No CMAKE_C_COMPILER could be found.
按理说emcmake会帮忙弄好环境,让cmake能找到编译器,结果与想象的不一样,试着直接指定 CMAKE_C_COMPILER
,然后还是报错
CMake Error at D:/Nanjing/web/build/webgl/CMakeFiles/3.27.2-msvc1/CMakeCCompiler.cmake:1 (set):
Syntax error in cmake code at
D:/Nanjing/web/build/webgl/CMakeFiles/3.27.2-msvc1/CMakeCCompiler.cmake:1
when parsing string
D:\Tools\emsdk\upstream\emscripten\emcc.bat
Invalid character escape '\T'.
Call Stack (most recent call first):
CMakeLists.txt:4 (PROJECT)
看了下生成的文件,cmake没有做转义,导致出现了\T,将路径改成/后,错误又变成了
CMake Error at C:/Program Files/Microsoft Visual Studio/2022/Professional/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.27/Modules/CMakeTestCCompiler.cmake:67 (message):
"D:/Tools/emsdk/upstream/emscripten/emcc.bat"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: 'D:/Nanjing/web/build/webgl/CMakeFiles/CMakeScratch/TryCompile-d51gcc'
Run Build Command(s): D:/Tools/bin/ninja.exe -v cmTC_a4a55
[1/2] D:\Tools\emsdk\upstream\emscripten\emcc.bat -MD -MT CMakeFiles/cmTC_a4a55.dir/testCCompiler.c.obj -MF CMakeFiles\cmTC_a4a55.dir\testCCompiler.c.obj.d -o CMakeFiles/cmTC_a4a55.dir/testCCompiler.c.obj -c D:/Nanjing/web/build/webgl/CMakeFiles/CMakeScratch/TryCompile-d51gcc/testCCompiler.c
[2/2] cmd.exe /C "cd . && D:\Tools\emsdk\upstream\emscripten\emcc.bat CMakeFiles/cmTC_a4a55.dir/testCCompiler.c.obj -o cmTC_a4a55.exe -Wl,--out-implib,libcmTC_a4a55.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cmd.exe /C "cd /D D:\Nanjing\web\build\webgl\CMakeFiles\CMakeScratch\TryCompile-d51gcc && "C:\Program Files\PowerShell\7\pwsh.exe" -noprofile -executionpolicy Bypass -file D:/Tools/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Nanjing/web/build/webgl/CMakeFiles/CMakeScratch/TryCompile-d51gcc/cmTC_a4a55.exe -installedDir D:/Tools/vcpkg/installed/x64-windows/bin -OutVariable out""
FAILED: cmTC_a4a55.exe
cmd.exe /C "cd . && D:\Tools\emsdk\upstream\emscripten\emcc.bat CMakeFiles/cmTC_a4a55.dir/testCCompiler.c.obj -o cmTC_a4a55.exe -Wl,--out-implib,libcmTC_a4a55.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cmd.exe /C "cd /D D:\Nanjing\web\build\webgl\CMakeFiles\CMakeScratch\TryCompile-d51gcc && "C:\Program Files\PowerShell\7\pwsh.exe" -noprofile -executionpolicy Bypass -file D:/Tools/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/Nanjing/web/build/webgl/CMakeFiles/CMakeScratch/TryCompile-d51gcc/cmTC_a4a55.exe -installedDir D:/Tools/vcpkg/installed/x64-windows/bin -OutVariable out""
cache:INFO: generating system asset: symbol_lists/2076b6e5b247b20fd0cb23eed4a27910eb635ffe.json... (this will be cached in "D:\Tools\emsdk\upstream\emscripten\cache\symbol_lists\2076b6e5b247b20fd0cb23eed4a27910eb635ffe.json" for subsequent builds)
cache:INFO: - ok
wasm-ld: error: unknown argument: --out-implib
wasm-ld: error: unknown argument: --major-image-version
wasm-ld: error: unknown argument: --minor-image-version
wasm-ld: error: cannot open libcmTC_a4a55.dll.a: no such file or directory
wasm-ld: error: cannot open 0: no such file or directory
wasm-ld: error: cannot open 0: no such file or directory
wasm-ld: error: unable to find library -lkernel32
wasm-ld: error: unable to find library -luser32
wasm-ld: error: unable to find library -lgdi32
wasm-ld: error: unable to find library -lwinspool
wasm-ld: error: unable to find library -lcomdlg32
wasm-ld: error: unable to find library -ladvapi32
这个有点说不过去了,我编译WebAssembly,你干啥要链接Windows的lib,最后打开emcmake.py的源码,看到原因了,原来是emcmake指定CMAKE_TOOLCHAIN_FILE
来使用emscripten的toolchain,前提是环境变量中没有定义这个,而我之前为了使用 vcpkg 编译 ffmpeg 的时候,设定了系统级的环境变量 CMAKE_TOOLCHAIN_FILE
,那么我跑emcmake之前取消掉这个环境变量应该就没问题了,试了一下,果然没问题了。
Last modified on 2024-03-06