關於在windows上構建LLVM,網上有很多文章,但都是互相抄來的,寫做時極不認真,不是少這個,就是少那個,沒有一篇是能夠完整照着作下來的,實在氣人。python
本文的安裝和配置過程,我親自操做過好幾遍,不惜爲此重裝操做系統,相信你們只要按照步驟嚴格操做,通常不會出意外的。windows
整個過程預計耗時4~5小時,具體取決於網速和機器配置,請你們在操做以前作好內心準備。函數
個人操做系統是Win7x64,計劃以x64爲目標平臺來構建。工具
準備清單:測試
一、Visual Studio 2017 Communityui
二、LLVM-7.0.1-win64 srcspa
【LLVM】http://releases.llvm.org/7.0.1/llvm-7.0.1.src.tar.xz
【CLang】http://releases.llvm.org/7.0.1/cfe-7.0.1.src.tar.xz
【Compiler-rt】http://releases.llvm.org/7.0.1/compiler-rt-7.0.1.src.tar.xz操作系統
三、CMake-3.14.0 x64命令行
四、python-3.7.1-amd64code
五、strawberry-perl-5.28.1.1-64bit
六、GetGnuWin32-0.6.3
準備上述資源時,請務必保證版本號不低於上述所列要求,最好和個人保持一致。
安裝步驟:
一、安裝CMake,安裝時注意勾選:把bin路徑加入PATH
二、安裝python,安裝時注意勾選:把bin路徑加入PATH
若是忘了加入PATH,後面CMake配置VS工程會失敗。
三、安裝strawberry-perl,這也是CMake依賴的,它在安裝後會自動加入PATH。
四、安裝GetGnuWin32,把bin路徑加入PATH
進入bin目錄,執行download.bat,下載全部組件,耗時很長,慢慢等待。
必定要等全部組件所有下載完,不然,後面CMake配置VS工程會失敗。
五、安裝VS2017,把C++桌面開發和通用桌面開發,都勾選上,裏面有C++編譯器和CMake相關工具。
六、解壓縮源代碼:
解壓縮llvm-7.0.1.src.tar.xz,調整目錄爲 E:/llvm
解壓縮cfe-7.0.1.src.tar.xz,調整目錄爲E:/llvm/tools/clang
解壓縮compiler-rt-7.0.1.src.tar.xz,調整目錄爲E:/llvm/projects/clang
七、運行VS2017的x64 本機工具命令行程序,執行如下命令來生成VS解決方案:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community> e: E:\> cd llvm E:\llvm> mkdir build E:\llvm\build> cd build E:\llvm\build> cmake -G "Visual Studio 15 Win64" e:/llvm
注意,Visual Studio 15表示VS2017,Win64表示目標平臺是x64。
若是是64位平臺,請務必選Win64,不然編譯出的程序沒法運行!
順便說一句,網上幾乎全部文章都會告訴你用 -Thost=x64來設置目標x64平臺,實際操做下來,根本無效!請嚴格按照我這裏的操做。
CMake生成過程當中,確定會出現不少looking for xxx - not found的提示,不要緊,不影響構建。
若是構建順利,最後會顯示以下結果:
-- Configuring done
-- Generating done
-- Build files have been written to: E:/llvm/build
八、打開VS2017,打開解決方案 E:/llvm/build/LLVM.sln,切換爲Release模式。
找到CMakePredefinedTargets目錄下的ALL_BUILD工程,開始構建,耗時很是很是長,耐心等待!
構建完成後,輸出的bin和lib在如下位置:E:/llvm/build/Release
九、確認編譯出的bin是x86仍是x64的
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community> clang -v
clang version 7.0.1(tags/RELEASE_701/final)
Target:x86_64-pc-windows-msvc
Thread model: posix
InstallerDir: E:\llvm\build\Release\bin
十、編譯測試程序:
#include <stdio.h> int main() { printf("Hello world!"); return 0; }
運行VS2017的x64 本機工具命令行程序,經過如下命令進行編譯:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community> D: D:\> clang --target=x86_64-pc-windows-msvc hello.c -o hello.exe D:\> hello.exe Hello world!
若是包含中文,會有亂碼問題。代碼以下:
#include <stdio.h>
int main() {
printf("你好 world!"); return 0; }
作了各類嘗試,結論以下:
一、把文件保存爲UTF-8格式是沒有用的!
二、調用setlocale函數也是沒有用的!
可行方案以下:
把文件保存爲ASCII格式,編譯時產生一個警告:
warning: illegal character encoding in string literal
[-Winvalid-source-encoding]
須要帶上一個參數,忽略這個警告。以下:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community> D: D:\> clang --target=x86_64-pc-windows-msvc -Wno-invalid-source-encoding hello.c -o hello.exe D:\> hello.exe 你好 world!
最後再測試一下lli.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community> D: D:\> clang -emit-llvm -c hello.c -o hello.bc -Wno-invalid-source-encoding D:\> lli hello.bc 你好 world!