筆記_fastbuild
- 筆記_fastbuild
- 1 基本介紹
- 2 文件腳本
- 3 具體實現步驟
- 4 遇到的問題
- 4.1 mspdb120.dll丟失,無法加載 mspdbst.dll (錯誤代碼: 193)
- 4.2 x86和x64問題
- 4.3 #ifdef WIN32 沒用
- 4.4 包含目錄問題,error LNK2019: 無法解析的外部符號
- 4.5 編出來的.obj太大了。
- 4.6 編譯器把警告或者不安全的用法當成錯誤停止編譯
- 4.7 error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”
- 4.8 error C2664: “CWnd::MessageBoxW”: 不能將參數 1 從“const char [17]”轉換為“LPCTSTR”
- 4.9 無法連接上工作機
- 4.10 連接上了工作機,但不能用工作機的核來編
- 4.11 用fbuild 編譯完,想在VS里進行調試,但是點了F5后,VS會再次編譯項目
- 4.12 std::max 無法和宏定義區分
- 4.13 VS的一些宏要修改,依賴庫要添加
- 5 擴展
- 6 參考資料
1 基本介紹
1.1 fastbuild介紹
1.1.1 作用
FastBuild 是一個針對 Windows、 Linux 和 OS x 的高性能、開源的構建系統,它支持高度可伸縮的編譯、緩存和網絡分布。
就是分布式編譯,也叫聯合編譯,加快編譯速度的。
原本一個項目只能用自己機器上的核來編,但太慢了,尤其是大型項目,有時候一不小心點個rebuild就,,,就可以點杯奶茶喝到下班了。
聯合編譯可以讓你用其它機器上的核來編,理論上貢獻出來的核越多,編得應該就越快。
c++在windows上用得比較多的聯編工具主要是IncrediBuild、FastBuild,在linux上一般是用distcc、icecream。
1.1.2 優勢
- 開源
划重點,不用花錢。
如果是有錢的老板,建議直接買IncrediBuild來用。沒這么麻煩,直接安上,配置一個調度機ip就能用,而且最牛的是和VS無縫對接。 - 可以通過緩存和網絡分發來加快構建的過程。
1.2 工作原理
需要編譯項目的機器暫且叫主機,能貢獻出來用的機器叫工作機。
主機用命令 fbuild.exe fbuild.bff -dist 啟動編譯,工作機要啟動 FBuildWorker.exe。
在fbuild.bff中描述了這個c++項目的編譯過程,也就是指定編譯器路徑、鏈接器路徑、包含目錄、庫目錄、源代碼目錄、編譯參數等等一些編譯必要的信息,和CMakeLists.txt有點類似。
工作機通過寫入一個令牌到一個共享文件夾來表示它們可以貢獻出來給別人用,主機通過檢查這個文件夾里的令牌來找到可用的工作機,然后Fastbuild會將主機上的編譯器工具鏈同步到工作機上,再接着把可以給工作機編譯的源文件發過去,工作機把源文件編譯成obj再發回給主機。
1.3 版本配置和項目環境
我用的win7的64位電腦,VS2013,lib庫和dll都有,要編的項目是需要生成32位的exe,fastbuild是v1.00版本。
我們項目組windows下聯編原本用的是IncrediBuild 5.0,但這個版本只能在win7上用,而且會和windows一些自動更新的補丁沖突導致不能聯編。用win10又用不了IncrediBuild,得花錢,最后能聯編的win7電腦起來越少,就只能去搞fastbuild。
很奇怪在網上搜到的資料很少,官網資料反而是最有用的,按理說這種能加快編譯速度的東西應該有挺多人用的,難道都是用的IncrediBuild嗎?
還好之前項目組里有個大佬搞了個半成品,在他的基礎上改出來的。
2 文件腳本
https://github.com/sbfhy/note_fastbuild
3 具體實現步驟
3.1
- 下載解壓
FASTBuild-Windows-x64-v1.00.zip - 在一台機器上設置一個共享文件夾,權限設置為所有人能自由讀寫。
- 添加環境變量,FASTBUILD_BROKERAGE_PATH設為共享文件夾路徑。
- 關掉防火牆
3.2 工作機上操作
- 啟動FBuildWorker.exe
設置了環境變量可以直接啟動。
也可以把start_fbuild_worker.bat腳本放到FBuildWorker.exe目錄下,修改里面指向的共享文件夾路徑,執行。
3.3 主機上操作
- 添加系統變量
系統變量,在Path后面添加FBuild.exe的路徑 D:\software\FastBuild\FASTBuild-Windows-x64-v1.00; - 修改template1.bff
修改template1.bff里面VS的安裝位置,WindowsSDK位置,編譯器和鏈接器位置,編譯選項,64位和32位的選擇。 - 生成.bff文件
修改buildvcxproj.bat里的.vcxproj路徑,執行。
會用vcxproj2bff.exe按照template1.bff里的規則,去讀取VS的.vcxproj配置文件,生成對應的.bff文件。
這個vcxproj2bff.exe是之前組里大佬搞出來的程序,沒有留下源碼,這個沒辦法,可能生成出來的.bff會有些小問題,自己手改一下。
其實就是像解xml文件一樣去解.vcxproj,取出包含目錄、庫目錄、源代碼目錄、編譯選項,然后按.bff的語法規則生成,這個如果有時間可以自己手擼個腳本也是一樣的。 - 啟動分布式編譯
修改fbuild.bat里的.bff路徑,執行。
腳本fbuild_start2.bat,也是啟動用的,可以實現在窗口顯示日志,並同時打出日志到文件中,看個人需求改吧,在需要看日志的時候可以用到。不過要下載一個tee.exe,放到C:\Windows\System32目錄下。
4 遇到的問題
4.1 mspdb120.dll丟失,無法加載 mspdbst.dll (錯誤代碼: 193)
https://www.azdll.net/files/mspdb120-dll 下載
注意版本問題,32位復制到C\Windows\System32,64位復制到C\Windows\SysWOW64。
打開“開始-運行-輸入regsvr32 mspdb120.dll。
打開“開始-運行-輸入regsvr32 mspdbst.dll。
120是VS2013用的,其它版本不是這個,看具體報錯具體解決吧。
4.2 x86和x64問題
我用的amd64_x86,編譯器cl.exe、鏈接器link.exe、庫生成器lib.exe都要改成相對應的路徑。
fatal error LNK1112: 模塊計算機類型“X86”與目標計算機類型“x64”沖突:
這種問題大概率是用的lib庫和dll庫在生成時的位數不對,要和你項目生成的位數對應,就是鏈接器選項和庫生成器選項中的' /MACHINE:X86',意思是指定目標計算機。
4.3 #ifdef WIN32 沒用
要加編譯選項,' /D "WIN32"'
__DEBUG,release也是類似
4.4 包含目錄問題,error LNK2019: 無法解析的外部符號
- 要和源文件里需要的頭文件對應上
比如有個頭文件路徑是 D\project\a\b\c.h ,
如果在源文件里是 #include "c.h" ,那包含目錄就要加上D\project\a\b ;
如果在源文件里是 #include "b\c.h" ,那包含目錄就要加上D\project\a ; - 一個.bff里,包含目錄下不能有相同名字的頭文件
比如有兩個源文件 D\project\a\c.cpp, D\project\b\c.cpp, 代碼里都是 #include "c.h", 然后包含目錄里加了兩個目錄 D\project\a, D\project\b,里面都有一個c.h。
這種情況有一個頭文件是匹配不到的,估計是匹配第一個目錄。
4.5 編出來的.obj太大了。
生成出來的.obj文件大小是正常的5倍多,因為加了 ' /Z7' 參數,加了調試信息, 生成包含用於調試器的完整符號調試信息的.obj文件,不生成任何 .pdb 文件。
4.6 編譯器把警告或者不安全的用法當成錯誤停止編譯
加上 ' /D "_SCL_SECURE_NO_WARNINGS"' 編譯參數忽略掉
4.7 error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”
工程的運行庫設置不一樣,加上一樣的編譯參數就好了,多線程(/MT)、多線程調試(/MTd)、多線程DLL(/MD)、多線程調試DLL(/MDd)、單線程(/ML)、單線程調試(/MLd)
4.8 error C2664: “CWnd::MessageBoxW”: 不能將參數 1 從“const char [17]”轉換為“LPCTSTR”
把“字符集”改為“使用多字節字符集”,也就是不要加編譯參數 /D "UNICODE"。
4.9 無法連接上工作機
- 工作機的核可能都在忙,或者模式沒設置好,要顯示Idle才表示可以貢獻出來用:
- 可能是共享文件夾權限不能自由讀寫,可以在共享文件夾創建文件試一下;
- 環境變量沒設置好;
- 防火牆沒關或網絡問題;
- 主機在啟動編譯時沒有加 -dist 或 -distverbose 參數;
主機編譯的日志里可以在開頭看到在找工作機的日志:
3 workers found in '\192.168.2.201\myshare_fastbuild\main\20.windows'
Distributed Compilation : 2 Workers in pool '\192.168.2.201\myshare_fastbuild\main\20.windows' - 工作機端口31264,可能被占用了,殺掉占用的進程;
可以通過cmd,輸入命令netstat -an |findstr 31264,查看socket連接。
正常連接上了,在界面上也是會有Connections提示的:
4.10 連接上了工作機,但不能用工作機的核來編
編譯器的環境沒有同步過去,環境包括編譯器和需要的dll,需要的dll一般都在cl.exe的同級目錄下。
參考 https://www.fastbuild.org/docs/functions/compiler.html
對於MSVC編譯器:
/ZW 選項不能使用
預編譯頭文件不能被分發,他們是因機器而異的。(使用了PCH的對象可以被分發)
/clr 選項不能使用,因為微軟編譯器的預處理器有bug。
如果連接上了工作機編譯,會打出 REMOTE 日志:
Obj: C:\Test\tmp\x86-Profile\TestFramework\Unity1.obj <REMOTE: 192.168.0.8>
4.11 用fbuild 編譯完,想在VS里進行調試,但是點了F5后,VS會再次編譯項目
這是因為bff配置沒有和vs配置完全一樣導致的,可以選擇attch調試。
4.12 std::max 無法和宏定義區分
(std::max),
(std::numeric_limits<UINT32>::max) error C2589: “(”:“::”右邊的非法標記
error C2440: “<function-style-cast>”: 無法從“overloaded-function”轉換為“UINT32” 上下文不允許消除重載函數的歧義
4.13 VS的一些宏要修改,依賴庫要添加
5 擴展
5.1 FASTBuildMonitor
下載 fastbuild monitor,VS編譯可視化插件,這個挺有用的,可以看到在主機的VS上看到其它工作機的編譯進度情況。
查看這個xml最后的報錯,缺少了一個VS2015的dll:
<entry>
<record>911</record>
<time>2020/05/26 13:50:22.457</time>
<type>Error</type>
<source>VisualStudio</source>
<description>End package load [FASTBuildMonitorPackage]</description>
<guid>{73DE7C44-188B-45D3-AAB2-19AF8724C5C9}</guid>
<hr>80004005 - E_FAIL</hr>
<errorinfo>未能加載文件或程序集“Microsoft.VisualStudio.Shell.14.0, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一個依賴項。系統找不到指定的文件。</errorinfo>
</entry>
裝個VS2015就有用了。。。
5.2 命令行參數
參考 https://www.fastbuild.org/docs/options.html
5.2.1 fbuild.exe
-dist : 開啟分布式編譯
-cache : 使用構建緩存
-config file.bff : 指定使用的bff文件,如果不用這個參數,就默認是同目錄下的fbuild.bff
-j2 : 限制本地只用2個核,沒那么卡
-monitor : 輸出一個機器可讀的文件,供第三方工具使用,FASTBuildMonitor就要加這個
-clean : 清理
-debug : 允許在啟動時立即附加調試器(僅限windows)
-nostoponerror : 出錯不要停止構建
5.2.2 FBuildWorker.exe
-console : 控制台模式啟動,並且隱藏了窗口,啟動后只在任務管理器中才能被看到(僅限windows)
-cpus=[n|-n|n%] : 分配工作的cpu
-mode=[disabled|idle|dedicated|proportional] : 設置啟動后模式
6 參考資料
https://www.fastbuild.org/docs/documentation.html 官方文檔,必看
https://github.com/fastbuild/fastbuild github源代碼
https://www.cnblogs.com/tangxin-blog/p/8635438.html 初識FASTBuild 一個大幅提升C/C++項目編譯速度的分布式編譯工具
https://www.cnblogs.com/tangxin-blog/p/8653715.html 在FASTBuild中使用Distribution
https://github.com/yass007/FASTBuildMonitor fastbuild monitor
https://www.bilibili.com/video/av70564103/ B站視頻,UE4#C++#20-FastBuild編譯環境
https://github.com/hillin/FASTBuild-Dashboard 面板,就是好看一點
https://github.com/LendyZhang/msfastbuild Utility to build Visual Studio solutions and projects with FASTBuild, supports VS2015/2017/2019.
https://www.cnblogs.com/Shaojunping/p/11941712.html fastbuild聯編ue4 shader的使用
https://lab.uwa4d.com/lab/5b85620802004fb65975b1f1 允許使用VS2015/VS2017和Windows 10下的FASTBuild構建虛幻引擎