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