-fuse-ld=lld必须置于-L/-l/--sysroot之前才生效,否则被忽略;LLD不识别--sysroot,需显式用-L指定交叉库路径,且不同目标平台对应不同LLD二进制(如lld、lld-link、wasm-ld)。

clang 交叉编译时 -fuse-ld=lld 必须放在 -L/-l 前面
Clang 在交叉编译下默认不调用 lld,哪怕你装了它、甚至系统里只有 lld 没有 GNU ld,它照样可能去调 link.exe(Windows)或宿主机的 /usr/bin/ld(Linux/macOS)。这不是 bug,是设计:Clang 只在明确且**位置正确**的指示下才切换链接器。
常见错误现象:ld: unknown option --gc-sections(GNU ld 选项被传给 LLD)、cannot find -lc(LLD 没搜到交叉 libc)、Windows 下完全不报错但静默用了 MSVC 的 link.exe。
-
-fuse-ld=lld必须出现在所有-L、-l、--sysroot之前;放错位置会被忽略 - 验证是否生效:加
-v看 clang 输出的最后一行链接命令,确认调用的是lld、lld-link还是link.exe - 不同目标平台对应不同 LLD 二进制:
lld(ELF)、lld-link(COFF)、wasm-ld(WASM),-fuse-ld=lld在 Windows 上会被 clang 自动映射为lld-link,但-fuse-ld=wasm-ld必须显式写全
lld 不识别 --sysroot,必须手动配 -L
GNU ld 支持 --sysroot=/path 并自动将 /path/usr/lib、/path/lib 加入库搜索路径;而 lld 对 --sysroot 的支持非常有限,尤其在交叉场景下基本忽略它——即使 clang 命令里写了 --sysroot,lld 也大概率不认。
结果就是:头文件能找到(-I 生效),但链接时报 cannot find -lc 或 undefined reference to 'printf'。
- 必须显式用
-L/path/to/sysroot/usr/lib和-L/path/to/sysroot/lib补齐路径 - 注意 triplet 子目录:ARM64 sysroot 中的库常在
/usr/lib/aarch64-linux-gnu/,漏掉这个路径会导致memcpy等基础符号找不到 - 静态链接(
-static)同样需要libc.a,所以-L路径里必须包含静态库,不能只靠动态库路径
目标三元组决定 lld-link 还是 lld,别硬套名字
不是所有平台加 -fuse-ld=lld 就等于调用 lld 二进制。Clang 会根据 -target 三元组自动选择后端链接器可执行名:
-
-target x86_64-unknown-linux-gnu→ 实际调用lld(或ld.lld) -
-target x86_64-pc-windows-msvc→ 实际调用lld-link(即使参数写的是-fuse-ld=lld) -
-target wasm32-unknown-unknown-wasi→ 必须写-fuse-ld=wasm-ld,写lld会失败
混淆点在于:Windows 下 lld-link.exe 和 lld.exe 是两个独立二进制,前者处理 COFF,后者处理 ELF;Clang 不会帮你纠错,只按规则映射。所以跨平台构建时,-v 输出里看到的链接器名才是唯一可信依据。
CMake 中指定 lld 链接器要分两步走
CMake 本身不直接控制链接器,它靠工具链文件把参数透给底层编译器。光在 CMAKE_CXX_FLAGS 里塞 -fuse-ld=lld 很可能失效——因为 CMake 生成的链接命令里,-fuse-ld 出现在 -l 后面,被 clang 忽略。
正确做法是通过链接器标志变量强制前置:
- 在 toolchain 文件中设置:
set(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=lld" CACHE STRING "") - 同时确保
CMAKE_SYSROOT不用于链接(lld 不认),改用set(CMAKE_FIND_ROOT_PATH "/path/to/sysroot")+ 显式-L路径 - 若用 Ninja 生成器,还可额外加
-DCMAKE_LINKER=lld(仅当lld在 PATH 中且名字匹配目标平台)
最易被忽略的是:CMake 的 CMAKE_SYSTEM_PROCESSOR 和 CMAKE_SYSTEM_NAME 必须与 -target 三元组语义一致,否则内部链接逻辑可能 fallback 到宿主链接器。

















