无法让clang-cl使用wasm-ld作为链接器的问题求助
无法让clang-cl使用wasm-ld替代默认lld链接器
我尝试了各种方法,始终无法让clang-cl使用wasm-ld而非默认的lld链接器。原本期望-fuse-ld=wasm-ld能生效,但并未成功,以下是我的配置文件与构建输出:
CMakeLists.txt
cmake_minimum_required(VERSION 3.18.0) project(wasm_test) set(CMAKE_LINKER "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/wasm-ld.exe") set(CMAKE_C_LINK_EXECUTABLE "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/wasm-ld.exe") set(CMAKE_CXX_LINK_EXECUTABLE "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/wasm-ld.exe") add_compile_options("-fuse-ld=C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/wasm-ld.exe") add_compile_options("--target=wasm32-unknown-wasi -nostdlib -Wl,--no-entry") add_executable(wasm_test add.cpp)
CMakePresets.json
{ "version": 8, "configurePresets": [ { "name": "clang-cl", "displayName": "Clang 17.0.3 (MSVC CLI) for MSVC 17.10.35027.167 (Visual Studio Community 2022 Release - amd64)", "description": "Using compilers: C = C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\Llvm\\x64\\bin\\clang-cl.exe, CXX = C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\Llvm\\x64\\bin\\clang-cl.exe", "generator": "Visual Studio 17 2022", "binaryDir": "${sourceDir}/out/build/${presetName}", "toolset": "ClangCL,host=x64", "cacheVariables": { "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", "CMAKE_C_COMPILER": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe", "CMAKE_CXX_COMPILER": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe" } } ], "buildPresets": [ { "name": "clang-Release", "displayName": "Clang 17.0.3 (MSVC CLI) for MSVC 17.10.35027.167 (Visual Studio Community 2022 Release - amd64) - Release", "configurePreset": "clang-cl", "configuration": "Release" } ] }
配置输出
[main] Configuring project: wasm [driver] NOTE: You are configuring with preset Clang 17.0.3 (MSVC CLI) for MSVC 17.10.35027.167 (Visual Studio Community 2022 Release - amd64), but there are some overrides being applied from your VS Code settings. [proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" -DCMAKE_INSTALL_PREFIX=C:/dev/project/wasm/out/install/clang-cl "-DCMAKE_C_COMPILER=C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe" "-DCMAKE_CXX_COMPILER=C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe" -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -SC:/dev/project/wasm -BC:/dev/project/wasm/out/build/clang-cl -G "Visual Studio 17 2022" -T ClangCL,host=x64 [cmake] -- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045. [cmake] -- The C compiler identification is Clang 17.0.3 with MSVC-like command-line [cmake] -- The CXX compiler identification is Clang 17.0.3 with MSVC-like command-line [cmake] -- Detecting C compiler ABI info [cmake] -- Detecting C compiler ABI info - done [cmake] -- Check for working C compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe - skipped [cmake] -- Detecting C compile features [cmake] -- Detecting C compile features - done [cmake] -- Detecting CXX compiler ABI info [cmake] -- Detecting CXX compiler ABI info - done [cmake] -- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe - skipped [cmake] -- Detecting CXX compile features [cmake] -- Detecting CXX compile features - done [cmake] -- Configuring done (3.7s) [cmake] -- Generating done (0.0s) [cmake] -- Build files have been written to: C:/dev/project/wasm/out/build/clang-cl
构建输出
[main] Building folder: C:/dev/project/wasm/out/build/clang-cl [build] Starting build [proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --build C:/dev/project/wasm/out/build/clang-cl --config Release --target wasm_test -- [build] MSBuild version 17.10.4+10fbfbf2e for .NET Framework [build] [build] 1>Checking Build System [build] Building Custom Rule C:/dev/project/wasm/CMakeLists.txt [build] clang-cl : warning : argument unused during compilation: '/O2' [-Wunused-command-line-argument] [C:\dev\project\wasm\out\build\clang-cl\wasm_test.vcxproj] [build] clang-cl : warning : argument unused during compilation: '/Ob2' [-Wunused-command-line-argument] [C:\dev\project\wasm\out\build\clang-cl\wasm_test.vcxproj] [build] clang-cl : warning : argument unused during compilation: '-fuse-ld=C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/wasm-ld.exe' [-Wunused-command-line-argument] [C:\dev\project\wasm\out\build\clang-cl\wasm_test.vcxproj] [build] lld-link : error : wasm_test.dir\Release\add.obj: unknown file type [C:\dev\project\wasm\out\build\clang-cl\wasm_test.vcxproj] [proc] The command: "C:\Program Files\CMake\bin\cmake.EXE" --build C:/dev/project/wasm/out/build/clang-cl --config Release --target wasm_test -- exited with code: 1 [driver] Build completed: 00:00:00.643 [build] Build finished with exit code 1
解决方法
放弃clang-cl,使用原生Clang编译WASM
clang-cl是MSVC兼容模式的Clang,默认生成Windows目标文件,和WASM目标不兼容,且不支持-fuse-ld这类原生Clang参数。直接切换到clang.exe而非clang-cl.exe。修改CMakeLists.txt配置
将链接器参数从编译选项中移除,改用链接选项,并明确指定WASI目标系统:
cmake_minimum_required(VERSION 3.18.0) project(wasm_test) # 指定原生Clang编译器 set(CMAKE_C_COMPILER "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang.exe") set(CMAKE_CXX_COMPILER "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang.exe") # 设置WASI目标系统 set(CMAKE_SYSTEM_NAME WASI) set(CMAKE_SYSTEM_VERSION 1) set(CMAKE_SYSTEM_PROCESSOR wasm32) # 配置wasm-ld链接器 set(CMAKE_LINKER "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/wasm-ld.exe") set(CMAKE_C_LINK_EXECUTABLE "${CMAKE_LINKER} <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_LINKER} <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") # 分离编译与链接选项 add_compile_options("--target=wasm32-unknown-wasi" "-nostdlib") add_link_options("--no-entry") add_executable(wasm_test add.cpp)
- 调整CMakePresets.json,使用Ninja生成器
避免MSBuild强制使用lld-link,改用Ninja作为构建生成器:
{ "version": 8, "configurePresets": [ { "name": "clang-wasm", "displayName": "Clang 17.0.3 for WASM", "generator": "Ninja", "binaryDir": "${sourceDir}/out/build/${presetName}", "cacheVariables": { "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}", "CMAKE_C_COMPILER": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang.exe", "CMAKE_CXX_COMPILER": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang.exe", "CMAKE_SYSTEM_NAME": "WASI", "CMAKE_SYSTEM_VERSION": "1", "CMAKE_SYSTEM_PROCESSOR": "wasm32" } } ], "buildPresets": [ { "name": "wasm-Release", "configurePreset": "clang-wasm", "configuration": "Release" } ] }
- 核心原因说明
-fuse-ld是Clang原生模式的参数,clang-cl(MSVC兼容模式)不识别该参数,这是出现"argument unused"警告的直接原因- MSBuild会强制绑定Windows目标的链接流程,必须脱离MSVC工具链的构建逻辑,改用原生Clang+Ninja组合才能正常编译WASM项目
内容的提问来源于stack exchange,提问作者Tasten
相关产品推荐
相关产品推荐

