Heresy 這邊現在開始試著將開發環境由 Visual Studio 2022 轉移到 Visual Studio 2026,由於微軟這幾年在 C++ 標準的支援、以及 ABI 相容性上都還算不錯,所以在轉移上還算順利。
不過,當要更新第三方函示庫的時候…恩,又踩到地雷了。
碰到主要的問題,是目前 Boost C++ Libraries 1.90.0(官網、以前的介紹)因為不認得 Visual Studio 2026 的 MSVC Toolset 的14.5 這個版本、所以沒辦法建置。
這個問題其實在 Visual Studio 2022 17.10 的時候就碰過了。主要的原因就是微軟自己把 Visual C++ 的版本搞得很複雜,包括 Visual Studio 版本(2026 是 18.x)、C++ 版本(19.5x)、MSVC Toolset 版本(14.5x)這三種(參考),然後 Boost 為了安全性又都採用窮舉式的方法來判斷,所以導致新的 14.5 出來後他不認得。
不過還好之前已經碰過,所以這次也比較知道該怎麼處理了。
想法
基本上 Visual Studio 2022 的 MSVC Toolset 版本雖然有 14.3x 和 14.4x 兩種可能,但是基本上都被歸類成 v143,在 Boost 建置出來的檔案中,也都是當成「vc143」;而 Visual Studio 2026 則是跳到 14.5x、會被歸類成 v145,也就是變成實際上沒有 v144 的狀況。
要自己修改 Boost 讓他支援 Visual Studio 2026 的話,這邊個人覺得應該有兩種做法:
- 把 Visual Studio 2026 當作 v143 的延伸,反正 ABI 相容,所以應該也不會有問題
- 把 Visual Studio 2026 獨立設定成 v145、和 Visual Studio 2022 做區隔
個人覺得兩種方案應該都可行?但是就不知道 Boost 之後會用哪種方法了?
而 Heresy 這邊則是試著建立出 v145 還和舊版做區隔。
檔案修改
由於這邊是打算建立出新的「v145」,所以這邊要修改的檔案有兩個:
- 建置腳本:
tools/build/src/tools/msvc.jam - 自動連結的 header:
boost/config/auto_link.hpp
如果是要沿用 v143 的話,應該只要修改 msvc.jam 就可以了。
tools/build/src/tools/msvc.jam 這個檔案要改的地方有兩個,基本上可以用「14.[34]」這個字串、來找到 Boost 偵測 Visual Studio 2022 的地方、然後加上 2026 的程式;下面是 Heresy 改的 patch 檔(gist):
diff --git a/tools/build/src/tools/msvc.jam "b/C:\\code\\msvc1.jam" index b6276bb..b541abb 100644 --- a/tools/build/src/tools/msvc.jam +++ b/tools/build/src/tools/msvc.jam @@ -1154,7 +1154,15 @@ local rule generate-setup-cmd ( version : command : parent : options * : cpu : g
}
else
{ - if [ MATCH "(14.[34])" : $(version) ] + if [ MATCH "(14.5)" : $(version) ] + { + if $(.debug-configuration) + { + ECHO "notice: [generate-setup-cmd] $(version) is 14.5" ; + } + parent = [ path.native [ path.join $(parent) "..\\..\\..\\..\\..\\Auxiliary\\Build" ] ] ; + } + else if [ MATCH "(14.[34])" : $(version) ]
{
if $(.debug-configuration) { @@ -1340,7 +1348,11 @@ local rule configure-really ( version ? : options * )
# version from the path.
# FIXME: We currently detect both Microsoft Visual Studio 9.0 and
# 9.0express as 9.0 here. - if [ MATCH "(MSVC\\\\14.[34])" : $(command) ] + if [ MATCH "(MSVC\\\\14.5)" : $(command) ] + { + version = 14.5 ; + } + else if [ MATCH "(MSVC\\\\14.[34])" : $(command) ]
{
version = 14.3 ;
}
如果是想繼續用 v143 的話,應該把所有的「14.[34]」改成「14.[345]」就可以了?不過 Heresy 自己沒測試過就是了。
Boost 在 Windows 環境建置出來的檔案,lib 檔的檔案名稱基本上是「libboost_atomic-vc145-mt-x64-1_90.lib」這樣的形式,看的出來 Boost 版本是 1.90、MSVC 是 vc145。
而由於 Boost 在 Visual Studio 建置的時候,會自動去連結 lib 檔案,所以如果版本不合的話,建置就會失敗;像是目前由於 Boost 1.90.0 由於還不支援 Visual Studio 2026、會把 MSVC 版本判斷為 vc143,所以會變成找不到編譯成 vc145 的 lib 檔案。
這時候,就是要修改「boost/config/auto_link.hpp」這個檔案;
下面就是針對這個檔案的 patch(gist):
diff --git a/boost/config/auto_link.hpp "b/c:\\code\\auto_link.hpp"
index 64dee1e..5b74c06 100644
--- a/boost/config/auto_link.hpp
+++ b/boost/config/auto_link.hpp
@@ -187,11 +187,16 @@ BOOST_LIB_SUFFIX: Static/import libraries extension (".lib", ".a") for the c
// vc14.2:
# define BOOST_LIB_TOOLSET "vc142"
-# elif defined(BOOST_MSVC)
+# elif defined(BOOST_MSVC) && (BOOST_MSVC < 1950)
// vc14.3:
# define BOOST_LIB_TOOLSET "vc143"
+# elif defined(BOOST_MSVC)
+
+ // vc14.3:
+# define BOOST_LIB_TOOLSET "vc145"
+
# elif defined(BOOST_EMBTC_WINDOWS)
// Embarcadero Clang based compilers:
如果不想修改的話,其實也可以直接把 Boost 所有的 lib 檔案裡面的 vc145 改成 vc143,基本上應該也可以解決問題。
這邊有要套用變更的話,基本上就是:
只要把這個檔案放在 的目錄下、然後透過下面的指令套用就可以了。
git apply msvc.jam.patch
之後 Heresy 這邊建置的指令,則是
建置
實際上要建置 Boost 的話,基本步驟就是:
- 下載 Boost 的原始碼壓縮檔案(官網)、例如「boost_1_90_0.7z」
- 解壓縮到資料夾,例如「
d:\boost_1_90_0」 - 把兩個 patch 檔案(連結)放到 boost 原始碼的根目錄
- 透過「
git apply msvc.jam.patch auto_link.hpp.patch」這個指令套用
之後 Heresy 這邊的建置指令是:
.\bootstrap.bat msvc
.\b2 toolset=msvc-14.5 address-model=64 --stagedir=lib64 --without-mpi cxxflags="-std:c++20"
最後建置好的 x64 版的 lib 檔案會都在 lib64 這個資料夾內。
大概就是這樣了?目前這樣修改 Heresy 這邊是可以動,就不知道會不會在某些特定狀況出問題了?再來,就是看 Boost 官方啥時會支援了。
另外題外話,某些函式庫是用 cmake 來產生 Visual Studio 專案,在升級到 Visual Studio 2026 後、產生的方案檔案會從本來的 .sln 變成新的、基於 XML 的 .slnx(之前有紀錄過);所以如果是透過腳本建置的話,可能要注意一下是否需要修改。
