要事第一;我使用的各种工具的版本:
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
分支。创建构建目录并在其下移动后,我使用以下命令:
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 的链接过程开始时,系统挂起(显然使用了太多内存),一段时间后我收到以下消息(片段重新生成 after 核心 llvm 构建完成):
[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.
(我跳过了中间的几行!)
欢迎任何帮助。
P.S.:由于我将使用 llvm 和 clang 的源代码,所以我不想要
release
构建。我认为真正的问题是静态链接,我的电脑无法处理。我查看了无法从其源代码构建 LLVM 的答案,但无法确定在何处以及如何设置标志。此外,Fatal Error building the llvm source code in Ubuntu 的答案也建议使用 cmake 标志。正确的标志组合应该是什么?
考虑到链接的帖子和评论,我首先安装了clang-12(适用于 Ubuntu 20.04 的版本),然后使用以下配置: (确保 build 和 installed 目录存在于项目根目录下)
user@system:~/llvm-project/build$ cmake -G "Ninja" \
-DCMAKE_C_COMPILER=$(which clang) \
-DCMAKE_CXX_COMPILER=$(which clang++) \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_TARGETS_TO_BUILD="X86;RISCV" \
-DCMAKE_BUILD_TYPE="RelWithDebInfo" \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_PARALLEL_COMPILE_JOBS=1 \
-DCMAKE_INSTALL_PREFIX=$(pwd)/../installed \
-DLLVM_PARALLEL_LINK_JOBS=1 \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DLLVM_LINK_LLVM_DYLIB=ON \
-DBUILD_SHARED_LIBS=OFF \
-DLLVM_USE_SPLIT_DWARF=ON \
-DLLVM_USE_LINKER=gold \
-DLLVM_OPTIMIZED_TABLEGEN=ON \
-DLLVM_USE_NEWPM=ON \
-DCMAKE_EXE_LINKER_FLAGS='-Wl,-no-keep-memory,-fuse-ld=gold' \
../llvm
配置完成后,通过以下方式执行构建:
ninja -j1 all
构建成功完成(大约需要 2 小时 10 米)。随后的install操作通过:
完成ninja install
主要目标是用动态链接替换构建库的静态链接,以防止内存不足问题。这导致工具比它们应该的慢(也就是说,从这个构建产生的 llvm 工具将运行得更慢),但是,考虑到硬件限制,这是最好的方法。
附言
C 和 C++ 编译器路径也可以设置为:
env CC=`which clang` CXX=`which clang++` \
或
CC='/lib/llvm-12/bin/clang' \
CXX='/lib/llvm-12/bin/clang++' \
在 cmake 命令之前。
RelWithDebInfo
可以替换为Debug
如果lld链接器可用:
gold
可以替换为lld
-fuse-ld=gold
可以替换为-fuse-ld=lld
-DLLVM_TARGETS_TO_BUILD="X86"
可以替换为-DLLVM_TARGETS_TO_BUILD="X86;RISCV"