關於在windows上構建LLVM,網上有不少文章,但都是互相抄來的,寫作時極不認真,不是少這個,就是少那個,沒有一篇是可以完整照著做下來的,實在氣人。
本文的安裝和配置過程,我親自操作過好幾遍,不惜為此重灌作業系統,相信大家只要按照步驟嚴格操作,一般不會出意外的。
整個過程預計耗時4~5小時,具體取決於網速和機器配置,請大家在操作之前做好心裡準備。
我的作業系統是Win7x64,計劃以x64為目標平臺來構建。
準備清單:
1、Visual Studio 2017 Community
2、LLVM-7.0.1-win64 src
【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
3、CMake-3.14.0 x64
4、python-3.7.1-amd64
5、strawberry-perl-5.28.1.1-64bit
6、GetGnuWin32-0.6.3
準備上述資源時,請務必保證版本號不低於上述所列要求,最好和我的保持一致。
安裝步驟:
1、安裝CMake,安裝時注意勾選:把bin路徑加入PATH
2、安裝python,安裝時注意勾選:把bin路徑加入PATH
如果忘了加入PATH,後面CMake配置VS工程會失敗。
3、安裝strawberry-perl,這也是CMake依賴的,它在安裝後會自動加入PATH。
4、安裝GetGnuWin32,把bin路徑加入PATH
進入bin目錄,執行download.bat,下載所有元件,耗時很長,慢慢等待。
一定要等所有元件全部下載完,否則,後面CMake配置VS工程會失敗。
5、安裝VS2017,把C++桌面開發和通用桌面開發,都勾選上,裡面有C++編譯器和CMake相關工具。
6、解壓縮原始碼:
解壓縮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
7、執行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
8、開啟VS2017,開啟解決方案 E:/llvm/build/LLVM.sln,切換為Release模式。
找到CMakePredefinedTargets目錄下的ALL_BUILD工程,開始構建,耗時非常非常長,耐心等待!
構建完成後,輸出的bin和lib在以下位置:E:/llvm/build/Release
9、確認編譯出的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
10、編譯測試程式:
#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;
}
做了各種嘗試,結論如下:
1、把檔案儲存為UTF-8格式是沒有用的!
2、呼叫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!