编译LLVM(release/16.x)clang链接时内存不足报错求助
问题描述
工具版本
OS: Ubuntu 20.04.1 LTS ld: 2.34 gold: GNU gold (GNU Binutils for Ubuntu 2.34) 1.16 gcc/g++: 9.4.0 cmake: 3.26.0 ninja: 1.10.0
硬件配置
memory: 16 GiB CPU: Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz
编译操作
克隆llvm-project的release/16.x分支,创建并进入build目录后执行:
user@system:~/llvm-project/build$ cmake -G "Ninja" -DLLVM_ENABLE_PROJECTS="lld;clang" -DLLVM_TARGETS_TO_BUILD="RISCV" -DCMAKE_BUILD_TYPE="Debug" -DLLVM_ENABLE_ASSERTIONS=On -DLLVM_PARALLEL_COMPILE_JOBS=1 -DLLVM_PARALLEL_LINK_JOBS=1 ../llvm user@system:~/llvm-project/build$ ninja -j 1
报错情况
LLVM核心编译顺利完成,但链接bin/clang-16时系统卡顿(疑似内存占用过高),一段时间后报错:
[0/613] Linking CXX executable bin/clang-16 FAILED: bin/clang-16 : && /usr/bin/c++ -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type ... ... ... ... lib/libLLVMDemangle.a -lrt -ldl -lpthread -lm && : collect2: fatal error: ld terminated with signal 9 [killed] compilation terminated. ninja: build stopped: subcommand failed.
求助需求
因需修改LLVM和Clang源码,不能使用Release构建。推测问题出在静态链接导致内存过载,求可行的CMake参数组合解决该问题。
解决办法
针对Debug模式下静态链接内存占用过高的问题,可通过以下CMake参数调整解决:
- 启用动态链接LLVM库:添加
-DLLVM_BUILD_SHARED_LIBS=On,将LLVM编译为动态库,链接Clang时内存占用会大幅降低,这是最直接有效的方案。 - 改用lld链接器:添加
-DLLVM_USE_LINKER=lld,lld的内存效率远高于GNU ld,即使保持静态链接,也能显著减少内存消耗。 - 精简编译组件:如果暂时不需要lld,可将
LLVM_ENABLE_PROJECTS改为仅clang;若后续需要再添加回来。(目前已指定RISCV目标架构,可保留) - 启用增量链接(可选):添加
-DLLVM_USE_INCREMENTAL_LINKING=On,该参数对GNU ld的内存优化有限,优先级低于前两种方案。
调整后的完整CMake命令示例:
cmake -G "Ninja" \ -DLLVM_ENABLE_PROJECTS="lld;clang" \ -DLLVM_TARGETS_TO_BUILD="RISCV" \ -DCMAKE_BUILD_TYPE="Debug" \ -DLLVM_ENABLE_ASSERTIONS=On \ -DLLVM_PARALLEL_COMPILE_JOBS=1 \ -DLLVM_PARALLEL_LINK_JOBS=1 \ -DLLVM_BUILD_SHARED_LIBS=On \ -DLLVM_USE_LINKER=lld \ ../llvm
注意事项
- 启用动态链接后,运行Clang时需确保动态库路径正确,可通过
export LD_LIBRARY_PATH=/path/to/llvm-project/build/lib设置。 - 如果系统未安装lld,需先执行
sudo apt install lld安装。
内容的提问来源于stack exchange,提问作者anurag
相关产品推荐
相关产品推荐

