踩坑記錄:因版本不匹配導致 Boost 1.85 編譯失敗的完整解決過程
轉載請注明出處,歡迎評論區交流。
背景
最近在 Windows 11 + VS2022 環境下嘗試用 b2
編譯 Boost 1.85.0,結果一路踩坑,最后發現罪魁禍首是 Boost.Build 自帶的 msvc.jam
對 VS 17.10(14.4)識別不完整。
官方 issue #931 里也提到了同樣的報錯,但沒有一個完整的解決流程,于是把今天的填坑過程記錄下來,希望能幫到后來者。
現象
執行:
bootstrap.bat
b2 toolset=msvc-14.4 variant=release
很快報錯退出,關鍵信息:
...patience...
...found 1891 targets...
...updating 4 targets...
msvc.write-setup-script
bin.v2\tools\build\src\engine\msvc-setup.bat
The system cannot find the path specified.
隨后 b2
直接退出,返回碼 1。用 --debug-configuration
再跑一次,發現 msvc.jam
里這一段:
if [ MATCH "(14.4)" : $(version) ]
{parent = [ path.native [ path.join $(parent) "..\..\..\..\..\Auxiliary\Build" ] ] ;
}
并沒有被執行,也就是說 Boost.Build 根本沒把 14.4 當成合法版本,于是 vcvarsall.bat
的路徑就拼錯,導致找不到編譯環境。
根因分析
-
Boost.Build 1.85 的
msvc.jam
只識別到 14.3
用文本編輯器打開
boost_1_85_0\tools\build\src\tools\msvc.jam
搜索14.3
能看到對應的if
分支,但 沒有 14.4。 -
**VS2022 17.10 的
_MSC_VER = 1940**, 對應
14.4` 工具集,Boost.Build 不認識,于是 fallback 失敗。
解決方案(任選其一)
? 方案 A:官方補丁文件直接替換(推薦)
-
下載官方提供的
msvc.zip
。 -
關閉所有占用
boost_1_85_0\tools\build\src\tools\msvc.jam
的編輯器/IDE。 -
把壓縮包里的
msvc.jam
覆蓋到
boost_1_85_0\tools\build\src\tools\msvc.jam
-
重新執行:
b2 toolset=msvc-14.4 -j8
-
編譯順利通過。
? 方案 B:手動打補丁(不想覆蓋文件時)
在 msvc.jam
的 else if [ MATCH "(14.3)" : $(version) ]
后面追加:
else if [ MATCH "(14.4)" : $(version) ]
{if $(.debug-configuration){ECHO "notice: [generate-setup-cmd] $(version) is 14.4" ;}parent = [ path.native [ path.join $(parent) "..\..\..\..\..\Auxiliary\Build" ] ] ;
}
保存后重新 b2
即可。
驗證
>b2 --version
B2 4.10.1 (OS=NT, jobs=8)>b2 toolset=msvc-14.4 address-model=64 architecture=x86 variant=release --with-system --with-filesystem
...found 2037 targets...
...updating 18 targets...
...updated 18 targets...
輸出無報錯,生成的 .lib
和 .dll
也正常。
小結
- Boost 1.85 尚未完全適配 VS2022 17.10,但社區補丁已經可用。
- 如果后續 VS 再升級,大概率還會遇到同樣問題,直接照葫蘆畫瓢在
msvc.jam
里加一行即可。 - 建議把補丁文件存一份到私有倉庫,CI/CD 里自動打補丁,避免每次手動操作。
參考資料
- GitHub issue #931: (需要翻墻)
Why can’t I build boost in my computer?