CentOS 7 如何安装llvm-project-10.0.0?
需要先升级gcc至7.5版本,详见CentOS 7如何编译安装升级gcc版本?一文
# 备份之前的yum .repo文件至 /tmp/repo_bak 目录
mkdir -p /tmp/repo_bak && cd /etc/yum.repo.d && /bin/mv ./*.repo /tmp/repo_bak# 更换yum软件源为阿里云镜像源,执行脚本后一直全部回车即可
bash <(curl -sSL https://linuxmirrors.cn/main.sh)# 使用阿里云镜像源安装编译依赖
yum install -y gcc gcc-c++ make cmake3 git zlib-devel ncurses-devel# 声明新GCC相关的环境变量,注意此步必须执行,否则后续GCC编译无法调用7.5版本新的运行库
cat << 'EOF' >> ~/.bashrc
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
export LIBRARY_PATH=/usr/local/lib64:$LIBRARY_PATH
export C_INCLUDE_PATH=/usr/local/include
export CPLUS_INCLUDE_PATH=/usr/local/include/c++/7.5.0
EOF
source ~/.bashrc# 验证系统是否可以加载到 libstdc++.so.6 与 GLIBCXX_3.4.21,若无法加载需升级gcc至7.5版本
ldd $(which g++) | grep libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6
strings /usr/local/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.21cd /tmp
# 下载 LLVM 源码
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/llvm-project-10.0.0.tar.xz
tar -xf llvm-project-10.0.0.tar.xz# 注意:此处必须创建单独的构建目录,必须在非源码目录中构建(LLVM 禁止 in-source build)
mkdir -p /tmp/llvm-project-10.0.0/llvm-build
cd /tmp/llvm-project-10.0.0/llvm-build# 运行 cmake3,在 build 目录中,指向 llvm 源码目录
cmake3 -G "Unix Makefiles" \-DCMAKE_C_COMPILER=/usr/local/bin/gcc \-DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \-DCMAKE_BUILD_TYPE=Release \-DCMAKE_INSTALL_PREFIX=/opt/llvm-10 \-DLLVM_ENABLE_PROJECTS="clang" \-DLLVM_TARGETS_TO_BUILD="X86" \-DLLVM_ENABLE_TERMINFO=OFF \../llvm# 编译并安装,预计需要3小时左右
make -j1 VERBOSE=1
sudo make install# 编译完成后验证 llvm-config
/opt/llvm-10/bin/llvm-config --version# 声明 LLVM-10 工具链 环境变量
cat << 'EOF' >> ~/.bashrc
export PATH=/opt/llvm-10/bin:$PATH
export LD_LIBRARY_PATH=/opt/llvm-10/lib:$LD_LIBRARY_PATH
EOF
source ~/.bashrc# 验证LLVM-10 工具链是否可以正常使用
clang --version
llvm-config --prefix
笔者安装踩坑过程:
1 执行cmake3 -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/opt/llvm-10 ../
输出ERROR:
CMake Error: The source directory “/tmp/llvm-project-10.0.0” does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
解决方案:cmake3构建要明确指定包含CMake构建系统核心配置文件的目录位置
llvm-project-10.0.0/
├── llvm ✅ <- 需要在cmake3构建命令结尾明确指定这个目录寻找CMake构建系统的核心配置文件
│ ├── CMakeLists.txt
│ └── ...
├── clang/
├── lld/
└── ...
改为为如下命令
cd /tmp
# 下载 LLVM 源码
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/llvm-project-10.0.0.tar.xz
tar -xf llvm-project-10.0.0.tar.xz# 注意:此处必须创建单独的构建目录,必须在非源码目录中构建(LLVM 禁止 in-source build)
mkdir -p /tmp/llvm-project-10.0.0/llvm-build
cd /tmp/llvm-project-10.0.0/llvm-buildcmake3 -G "Unix Makefiles" \-DCMAKE_C_COMPILER=/usr/local/bin/gcc \-DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \-DCMAKE_BUILD_TYPE=Release \-DCMAKE_INSTALL_PREFIX=/opt/llvm-10 \-DLLVM_ENABLE_PROJECTS="clang" \-DLLVM_TARGETS_TO_BUILD="X86" \-DLLVM_ENABLE_TERMINFO=OFF \../llvm # ✅ <- 明确指定llvm目录,用于寻找CMake构建系统的核心配置文件
2 在/tmp/llvm-project-10.0.0/lllvm目录下cmake3 构建输出ERROR:
CMake Error at CMakeLists.txt:242 (message):
In-source builds are not allowed.
Please create a directory and run cmake from there, passing the path
to this source directory as the last argument.
This process created the file CMakeCache.txt’ and the directory
CMakeFiles’.
Please delete them.
– Configuring incomplete, errors occurred!
See also “/tmp/llvm-project-10.0.0/llvm/CMakeFiles/CMakeOutput.log”.
解决方案:LLVM 明确要求在单独的 build 目录中构建,禁止在源代码目录 llvm-project-10.0.0/llvm
中运行了 cmake3
3 执行make -j$(nproc)
输出ERROR:
CMake Error at cmake/modules/CheckCompilerVersion.cmake:38 (message):
Host GCC version must be at least 5.1, your version is 4.8.5.
Call Stack (most recent call first):
cmake/modules/CheckCompilerVersion.cmake:48 (check_compiler_version)
cmake/config-ix.cmake:13 (include)
CMakeLists.txt:623 (include)
– Configuring incomplete, errors occurred!
See also “/tmp/llvm-project-10.0.0/build/CMakeFiles/CMakeOutput.log”.
解决方案:编译要求 GCC ≥ 5.1,但CentOS 7系统默认是 4.8.5,升级系统GCC版本至7.5,详见CentOS 7如何编译安装升级gcc版本?一文
4 执行make -j$(nproc)
输出ERROR:
…/…/…/bin/llvm-tblgen: /lib64/libstdc++.so.6: version GLIBCXX_3.4.20’ not found (required by …/…/…/bin/llvm-tblgen)
…/…/…/bin/llvm-tblgen: /lib64/libstdc++.so.6: version CXXABI_1.3.9’ not found (required by …/…/…/bin/llvm-tblgen)
…/…/…/bin/llvm-tblgen: /lib64/libstdc++.so.6: version GLIBCXX_3.4.21’ not found (required by …/…/…/bin/llvm-tblgen)
make[2]: *** [include/llvm/IR/Attributes.inc] Error 1
make[2]: Leaving directory /home/tmp/llvm-project-10.0.0/llvm-build’
make[1]: *** [include/llvm/IR/CMakeFiles/intrinsics_gen.dir/all] Error 2
make[1]: Leaving directory /home/tmp/llvm-project-10.0.0/llvm-build’
make: *** [all] Error 2
解决方案:先声明环如下境变量,再将make -j$(nproc)
并行编译改为make -j1 VERBOSE=1
# 声明新GCC相关的环境变量,注意此步必须执行,否则后续GCC编译无法调用7.5版本新的运行库
cat << 'EOF' >> ~/.bashrc
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
export LIBRARY_PATH=/usr/local/lib64:$LIBRARY_PATH
export C_INCLUDE_PATH=/usr/local/include
export CPLUS_INCLUDE_PATH=/usr/local/include/c++/7.5.0
EOF
source ~/.bashrc
5 执行clang --version
与 llvm-config --prefix
输出ERROR:
clang: /lib64/libstdc++.so.6: version GLIBCXX_3.4.22 not found (required by clang) clang: /lib64/libstdc++.so.6: version
GLIBCXX_3.4.20 not found (required by clang)
clang: /lib64/libstdc++.so.6: version GLIBCXX_3.4.21 not found (required by clang) clang: /lib64/libstdc++.so.6: version
CXXABI_1.3.9 not found (required by clang)
llvm-config: /lib64/libstdc++.so.6: version CXXABI_1.3.9 not found (required by llvm-config) llvm-config: /lib64/libstdc++.so.6: version
GLIBCXX_3.4.21 not found (required by llvm-config)
解决方案:声明新GCC相关的环境变量使动态链接器可以加载到新GCC的 libstdc++库
# 声明新GCC相关的环境变量,注意此步必须执行,否则后续GCC编译无法调用7.5版本新的运行库
cat << 'EOF' >> ~/.bashrc
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
export LIBRARY_PATH=/usr/local/lib64:$LIBRARY_PATH
export C_INCLUDE_PATH=/usr/local/include
export CPLUS_INCLUDE_PATH=/usr/local/include/c++/7.5.0
EOF
source ~/.bashrc