从源 (release/16.x) 构建 llvm 项目时,clang-16 的链接失败

问题描述 投票:0回答:1

要事第一;我使用的各种工具的版本:

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 标志。正确的标志组合应该是什么?

cmake build clang llvm ninja
1个回答
0
投票

考虑到链接的帖子和评论,我首先安装了clang-12适用于 Ubuntu 20.04 的版本),然后使用以下配置: (确保 buildinstalled 目录存在于项目根目录下

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"

© www.soinside.com 2019 - 2024. All rights reserved.