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