构建LLVM-MLIR时无法使用LLD链接器的问题排查与解决
问题场景
按照MLIR官方构建指南构建MLIR时,添加可选参数-DLLVM_ENABLE_LLD=ON后,CMake抛出核心错误:
Host compiler does not support '-fuse-ld=lld'
环境信息
- Clang版本:
Ubuntu clang version 12.0.0-3ubuntu1~20.04.5
- LLD版本:
LLD 10.0.0 (compatible with GNU linkers)
执行的CMake命令
cmake -G Ninja ../llvm \ -DCMAKE_INSTALL_PREFIX=/home/user/Documents/compilers/llvm/ \ -DLLVM_PARALLEL_COMPILE_JOBS=7 \ -DLLVM_PARALLEL_LINK_JOBS=1 \ -DLLVM_BUILD_EXAMPLES=ON \ -DLLVM_TARGETS_TO_BUILD="X86;NVPTX;AMDGPU" \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_EXTERNAL_PROJECTS=iwyu \ -DLLVM_EXTERNAL_IWYU_SOURCE_DIR=/home/user/Downloads/compilers/include-what-you-use/ \ -DLLVM_ENABLE_ASSERTIONS=ON \ -DLLVM_CCACHE_BUILD=ON \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DLLVM_ENABLE_PROJECTS='clang;lldb;lld;mlir;clang-tools-extra;compiler-rt' \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DLLVM_ENABLE_LLD=ON
附加错误信息(来自CMakeError.log)
Checking whether the ASM compiler is GNU using "--version" did not match "(GNU assembler)|(GCC)|(Free Software Foundation)":
Ubuntu clang version 12.0.0-3ubuntu1~20.04.5
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/binDetermining if the include file malloc/malloc.h exists failed with the following output:
Change Dir: /home/user/Downloads/compilers/llvm-project/build/CMakeFiles/CMakeTmpRun Build Command(s):/usr/bin/ninja cmTC_be9c4 && [1/2] Building C object CMakeFiles/cmTC_be9c4.dir/CheckIncludeFile.c.o
FAILED: CMakeFiles/cmTC_be9c4.dir/CheckIncludeFile.c.o
/usr/bin/clang -O3 -DNDEBUG -o CMakeFiles/cmTC_be9c4.dir/CheckIncludeFile.c.o -c CheckIncludeFile.c
CheckIncludeFile.c:1:10: fatal error: 'malloc/malloc.h' file not found
#include <malloc/malloc.h>
^~~~~~~~~~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.
报错原因分析
- LLD版本不兼容:Clang 12需要匹配至少同版本的LLD(12.x),当前系统LLD为10.0.0,版本差距过大导致Clang无法识别该版本的LLD,触发
-fuse-ld=lld不支持的错误。 - 系统头文件缺失:
malloc/malloc.h是BSD系头文件,Ubuntu(GNU/Linux)使用stdlib.h替代,CMake跨平台检测时找不到该文件,干扰构建流程。 - 汇编器检测异常:CMake默认期望GNU汇编器,但当前系统使用Clang集成的汇编器,版本检测逻辑不匹配导致报错。
解决步骤
1. 升级/指定匹配版本的LLD
- 安装与Clang 12对应的LLD版本:
sudo apt install lld-12 - 在CMake命令中明确指定LLD路径,替换原有的
-DLLVM_ENABLE_LLD=ON:-DCMAKE_LINKER=/usr/bin/lld-12 \ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld-12" \ -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld-12" \ -DCMAKE_MODULE_LINKER_FLAGS="-fuse-ld=lld-12"
2. 修复头文件与汇编器检测问题
- 安装GNU汇编器,满足CMake的检测要求:
sudo apt install binutils - 或强制CMake使用Clang的汇编器:
-DCMAKE_ASM_COMPILER=clang - 安装系统核心头文件包,解决
malloc/malloc.h缺失问题:sudo apt install libc6-dev
3. 清理并重新构建
删除原有build目录下的缓存文件,重新执行修改后的CMake命令:
rm -rf build/* cd build # 执行修改后的cmake命令
内容的提问来源于stack exchange,提问作者dearn44

