最近業(yè)務(wù)需要研究LLVM抽象語法樹(AST)和中間代碼(IR)生成,需要安裝LLVM登疗,在安裝過程中排截,遇到了很多問題。網(wǎng)上雖然有很多類blog谜叹,但比較零散匾寝,在實際安裝過程中,仍會遇到很多坑要填荷腊,為了避免其他人也遇到類似問題艳悔,特此將安裝LLVM過程中遇到的各種問題匯總記錄一下。如果對各位有所幫助實屬吾幸女仰。
注意:本文CentOS為docker從repository 拉取的7.x的鏡像猜年;如果與你的環(huán)境不一致,可參考主要步驟即可疾忍。
LLVM安裝主要步驟參考了博客《??LLVM學(xué)習(xí)之路(一) LLVM+Clang 編譯與安裝?》乔外,并對其中未說明的問題進(jìn)行了大量補(bǔ)充。安裝過程中千萬注意第二步到第五步順序不可顛倒R徽帧杨幼!,否則會安裝失斈粼ā差购!;閑話不多說汉嗽,讓我們開啟LLVM安裝之旅吧欲逃。
第一步、安裝SVN
CentOS7下自帶svn饼暑,不需要下載安裝稳析,可使用命令查看svn版本?
[root@localhost /]# svn - -version
如果沒有svn,則安裝svn弓叛,使用yum命令?
[root@localhost /]# yum install subversion
本文的重點在于LLVM的安裝彰居,如果需要完整版的svn安裝過程,可以參考博客《CentOS7下安裝SVN服務(wù)》(點擊即可跳轉(zhuǎn))
第二步撰筷、安裝/升級GCC(GCC版本應(yīng)不小于5.1.0陈惰,本文安裝版本為?GCC?8.3.0)
1 下載GCC安裝碼包
wget http://ftp.gnu.org/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz
2 解壓
tar jxf gcc-8.3.0.tar.gz
3 下載編譯依賴
cd gcc-8.3.0
./contrib/download_prerequisites
4 生成Makefile先建一個編譯的目錄gcc-build-8.3.0
mkdir gcc-build-8.3.0
cd gcc-build-8.3.0/
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
5 編譯
make -j4
4表示使用4個核心,根據(jù)您的CPU來指定闭专。也可不指定任何參數(shù)奴潘。6 安裝
sudo make install
7 驗證
gcc -v
還有原來的版本,重啟后影钉,再驗證OK
8 更新動態(tài)庫查看動態(tài)庫的版本:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
...
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
...?
?
確實沒有更新画髓,默認(rèn)情況下,會安裝在如下目錄:
/usr/local/lib64/libstdc++.so.6.0.25
簡單了平委,將原來的庫替換為上面的就可以了:
rm -rf /usr/lib64/libstdc++.so.6
ln -s /usr/local/lib64/libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6
然后再查看動態(tài)庫的版本:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
結(jié)果
....
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
....
第三步奈虾、安裝/升級python(python版本應(yīng)不小于2.7,本文安裝版本為?python?3.7.0)
第四步廉赔、接下來要解決GCC的版本沖突問題
請參考鏈接:https://blog.csdn.net/u012973744/article/details/36197937/
第五步肉微、安裝cmake(建議版本應(yīng)不小于,本文安裝版本為cmake3.15.7)
第六步蜡塌、安裝LLVM? 6.0
下載LLVM 6.0源碼(建議重命名為llvm):
cd where-you-want-llvm-to-live
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
下載 Clang源碼(建議重命名為clang):
cd where-you-want-llvm-to-live
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
下載?Clang-extra-Tools源碼(建議重命名為extra):
cd where-you-want-llvm-to-live
cd llvm/tools/clang/tools
svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
下載LLD linker [可選,鏈接器]:
cd where-you-want-llvm-to-live
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/lld/trunk lld
下載 Polly Loop Optimizer [可選碉纳,循環(huán)和數(shù)據(jù)優(yōu)化器]:
cd where-you-want-llvm-to-live
? ? ? ? cd llvm/tools
? ? ? ? svn co http://llvm.org/svn/llvm-project/polly/trunk polly
下載?Compiler-RT(建議重命名為Compiler-RT):
cd where-you-want-llvm-to-live
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
下載?Libomp [可選,如果需要openmp支持的話再下載]:
cd where-you-want-llvm-to-live
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/openmp/trunk openmp
下載? libcxx and libcxxabi [可選]:
cd where-you-want-llvm-to-live
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi
下載?Test Suite Source Code [可選馏艾,llvm自帶測試劳曹,較大]
cd where-you-want-llvm-to-live
cd llvm/projects
svn co http://llvm.org/svn/llvm-project/test-suite/trunk test-suite
2.也可以直接從網(wǎng)站下載源代碼按以上目錄結(jié)構(gòu)解壓:http://releases.llvm.org/
? ? 下載所需要版本的對應(yīng)源碼即可
編譯安裝
可在llvm解壓同級目錄下新建llvm-build文件夾
進(jìn)入llvm-uild目錄:
cd llvm-build
編譯llvm源碼(盡量選擇Release安裝,比較快琅摩,默認(rèn)Debug安裝會比較慢):
cmake -G "Unix Makefiles" -DLLVM_ENABLE_ASSERTIONS=On -DCMAKE_BUILD_TYPE=Release ../llvm
注意:這里容易出現(xiàn)GCC環(huán)境更新的問題铁孵,“明明我在前邊幾步已經(jīng)更新了GCC環(huán)境,可是仍人Cmake的時候仍然拋出GCC環(huán)境.o庫缺失”的問題房资,看到網(wǎng)上遇到類似問題的人很多蜕劝。如果你也恰巧遇到,可以按照第三步中更新GCC的方法重新操作一下轰异,然后將*/llvm-uild/*目錄下的所有文件清除(rm -rf *)即可岖沛。然后再次執(zhí)行? cmake -G "Unix Makefiles" -DLLVM_ENABLE_ASSERTIONS=On -DCMAKE_BUILD_TYPE=Release ../llvm
?(啟用多個線程編譯[這里用4個])
make -j4?
make install
至此,LLVM+Clang基本安裝完畢溉浙。
測試舉例
查看clang版本:
clang --version
獲取幫助選項:
clang -help
也可以編寫簡單的helloworld程序hello.c來用clang進(jìn)行編譯:
clang hello.c
./a.out
或:
clang hello.c -o hello
./hello
至于為什么編譯安裝的LLVM+Clang卻只測試clang烫止,那么來看一下如何簡單的使用LLVM:
將hello.c編譯為LLVM IR的二進(jìn)制文件(得到hello.bc):
clang -emit-llvm -c hello.c -o hello.bc
使用llvm虛擬機(jī)執(zhí)行hello.bc(輸出“hello world!”):
lli hello.bc
將hello.bc從二進(jìn)制轉(zhuǎn)換為可讀的IR文件(得到hello.ll):
llvm-dis hello.bc