使用 Visual Studio 2026 建置 Boost

| | 0 Comments| 09:44|
Categories:

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 的話,基本步驟就是:

  1. 下載 Boost 的原始碼壓縮檔案(官網)、例如「boost_1_90_0.7z」
  2. 解壓縮到資料夾,例如「d:\boost_1_90_0
  3. 把兩個 patch 檔案(連結)放到 boost 原始碼的根目錄
  4. 透過「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之前有紀錄過);所以如果是透過腳本建置的話,可能要注意一下是否需要修改。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *