LLVM编译报错解决:collect2: fatal error: ld terminated with signal 9 [Killed]

LLVM 编译安装

  1. 克隆代码到本地
git clone https://github.com/llvm/llvm-project.git
# 需要时间比较长 如果不需要做额外的操作可以只克隆最新的commit
git clone --depth 1 https://github.com/llvm/llvm-project.git
  1. 配置编译选项
cd llvm-project
cmake -S llvm -B build -G <generator> [options]

generator一般使用Ninja,而 options 中必须要传入的参数是构建类型CMAKE_BUILD_TYPE

不同的CMAKE_BUILD_TYPE区别如下:

Build TypeOptimizationDebug InfoAssertion
ReleaseFor SpeedNoNo
DebugNoneYesYes
RelWithDebInfoFor SpeedYesNo
MinSizeRelFor SizeNoNo
  1. Release适合LLVM和Clang的用户,针对运行速度进行了优化,基本没有任何调试信息和断言信息。
  2. Debug适合LLVM的开发者,输出的信息最丰富,但没有进行任何方面的优化。
  3. RelWithDebInfo适合有部分开发需求的用户,该构建方式针对速度进行了优化,且会输出调试信息。
  4. MinSizeRel适合空间硬盘空间受限的用户,该构建方式同样没有任何调试信息和断言信息,但是针对占用空间大小进行了优化。

综上所述,一般的构建可以通过下面的命令进行:

cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build build

编译报错解决

编译LLVM时报错:

[3223/3502] Linking CXX executable bin/llvm-c-test
FAILED: bin/llvm-c-test
: && /usr/bin/c++ -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -fno-lifetime-dse -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-nonnull -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wno-comment -Wno-misleading-indentation -fdiagnostics-color -g -Wl,-rpath-link,/home/shanlin/llvm-project/build/./lib tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/attributes.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/calc.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/debuginfo.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/diagnostic.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/disassemble.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/echo.cpp.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/helpers.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/include-all.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/main.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/module.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/metadata.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/object.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/targets.c.o -o bin/llvm-c-test  -Wl,-rpath,"\$ORIGIN/../lib:/usr/local/lib:"  lib/libLLVMAArch64AsmParser.a  lib/libLLVMAMDGPUAsmParser.a  lib/libLLVMARMAsmParser.a  lib/libLLVMAVRAsmParser.a  lib/libLLVMBPFAsmParser.a  li
	.....
lib/libLLVMBitstreamReader.a  lib/libLLVMTextAPI.a  lib/libLLVMDebugInfoMSF.a  lib/libLLVMDebugInfoBTF.a  lib/libLLVMARMDesc.a  lib/libLLVMARMInfo.a  lib/libLLVMARMUtils.a  lib/libLLVMHexagonDesc.a  lib/libLLVMHexagonInfo.a  lib/libLLVMLanaiDesc.a  lib/libLLVMLanaiInfo.a  lib/libLLVMLoongArchDesc.a  lib/libLLVMLoongArchInfo.a  lib/libLLVMRISCVDesc.a  lib/libLLVMRISCVInfo.a  lib/libLLVMSystemZDesc.a  lib/libLLVMSystemZInfo.a  lib/libLLVMWebAssemblyDesc.a  lib/libLLVMWebAssemblyInfo.a  lib/libLLVMMCDisassembler.a  lib/libLLVMCodeGenTypes.a  lib/libLLVMMC.a  lib/libLLVMBinaryFormat.a  lib/libLLVMTargetParser.a  lib/libLLVMDebugInfoCodeView.a  lib/libLLVMSupport.a  lib/libLLVMDemangle.a  -lrt  -ldl  -lpthread  -lm  /usr/local/lib/libz.so  /usr/lib/x86_64-linux-gnu/libtinfo.so && :
collect2: fatal error: ld terminated with signal 9 [Killed]
compilation terminated.

查了一下网上给出的解决方法和原因,

这种情况很可能是OOM了,因为默认情况下所有的可执行文件都是静态链接的,所以会需要很多RAM

解决方法如下:

  1. 减少链接时的并行,通过添加-DLLVM_PARALLEL_LINK_JOBS=1编译选项来控制链接的并行。
  2. 通过-Wl, no-keep-memory-Wl,--reduce-memory-overheads两个或其中一个加入CMAKE_EXE_LINKER_FLAGS来减少内存的消耗。
  3. 更换链接器,通过添加-fuse-ld=gold或者-fuse-ld=lldCMAKE_EXE_LINKER_FLAGS来更换链接器。

尝试了方法1,直接解决了:

cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DLLVM_PARALLEL_LINK_JOBS=1
cmake --build build

cmake 参数:

  • -S : path to the source
  • -B : path to the build
  • –build : build a CMake-generate project binary tree.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值