1. 程式人生 > >【作死之旅】clang + windows 10 + mingw64 + boost

【作死之旅】clang + windows 10 + mingw64 + boost

提示:留下評論有助於加強我的快樂,會讓我覺得自己所折騰的東西很有價值

 

最近腦袋一抽風,想從msvc轉到clang,踩了無數個坑,耗時3天,終於把環境跑起來了,哈哈哈哈,雖然我還是不會拋棄msvc。

 

環境:Windows 10、clang 7.0、mingw64 8.1.0 x86_x64、boost 1.68.0

 

這個環境陣容絕對誠意滿滿,都是按照最新的環境來配置的。

 

首先到官網下載llvm和mingw64,我要配兩個版本的環境,32和64的各要下載一個版本。為什麼要準備兩個版本?clang雖然支援交叉編譯,但是mingw64不支援,mingw64有32位、64位兩個版本,它是不能交叉編譯的,也就是說32位的mingw64只能編譯32位的程式,64位的mingw64也是一樣。LLVM和mingw64的配置可以參考 

 

https://www.zhihu.com/question/30315894

 

OK,環境已經弄完了,接下來是一些很寶貴的工程經驗,我踩了兩天的坑得出來的。

 

首先要明白的是,clang是編譯器系統的前端,後端使用的是llvm,clang做語法解析,llvm負責生成機器碼,mingw64負責提供Windows的系統庫。

 

但是這裡有個很坑的地方,我不知道為什麼clang 7.0 編譯不了 boost 1.68.0,我試了一天的時間也沒成功,經常報 error: cannot compile this non-trivial TLS destruction yet 錯誤。

 

絞盡腦汁,搜遍全網資料,好像沒有任何一個人像我一樣傻逼的在Windows下用clang + boost這個組合的,不得已放棄。在一段蹲坑的時間裡,突然腦洞大開,然後回到電腦前先用mingw64(gcc)編譯了boost 1.68,然後寫了個demo測試,用clang編譯的demo可以跟mingw64編譯的boost庫搭配起來無痛使用。

 

成功!

 

編譯boost的命令列:

 

1、bootstrap gcc

2、b2 -j16 address-model=64 toolset=gcc stage

 

然後把.a檔案和標頭檔案,複製到mingw的目錄就行了,這個大家自己琢磨一下該放哪裡,很簡單,我要寫出來又很長很麻煩。

 

接著遇到一個問題,我不知道怎麼連結boost的靜態庫,又查了兩個多小時,編譯程式碼時 clang 加上 -lboost_system-mgw81-mt-1_68(相應的庫)就可以了。這個引數也很傻逼,也要說一下。如果一個庫檔名字叫做 libabc.a,那麼你的選項要寫成 -labc;如果一個庫的名字叫做libdashabi.a,那麼這個選項就要寫成-ldashabi,大家都能領悟其中的內涵的,也不多廢話了。

  64位的clang target:--target=x86_64-w64-mingw32 32位的clang target:--target=i686-w64-mingw32   配置mingw64時會很容易記住target的內涵,這個很好理解,然後這裡還有一個坑。如果你選的mingw64是posix執行緒模型,請注意,這裡你是沒辦法直接靜態編譯的,如果你想靜態編譯的話,要自己去折騰pthread相關的東西,具體我就暫時不深究了,因為我不需要靜態編譯,如果有人研究出來記得告訴我一聲。如果你想直接靜態編譯exe,那麼你要選擇win32執行緒,但是使用win32執行緒模型也有個問題,就是沒辦法使用std::thread。   還有一個小瑕疵,就是clang的編譯命令列傳入的是單個程式碼檔案。但是一個程式不可能只有一個cpp的,所以編譯時傳入的檔名改成:*.cpp。   OK,現在已經能用clang開玩基本的中型專案了。由於我弄的是客戶端軟體,我專門跑到XP SP3測試了一遍,mingw64生成的32位exe是可以跑在XP上的(前提是沒用到XP之後的API),最大的牽掛也落地了。