You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法让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

解决方法

  1. 放弃clang-cl,使用原生Clang编译WASM
    clang-cl是MSVC兼容模式的Clang,默认生成Windows目标文件,和WASM目标不兼容,且不支持-fuse-ld这类原生Clang参数。直接切换到clang.exe而非clang-cl.exe。

  2. 修改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)
  1. 调整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"
        }
    ]
}
  1. 核心原因说明
  • -fuse-ld是Clang原生模式的参数,clang-cl(MSVC兼容模式)不识别该参数,这是出现"argument unused"警告的直接原因
  • MSBuild会强制绑定Windows目标的链接流程,必须脱离MSVC工具链的构建逻辑,改用原生Clang+Ninja组合才能正常编译WASM项目

内容的提问来源于stack exchange,提问作者Tasten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:07:02