之前在《Visual Studio 使用 C++ 時混亂的版本編號》有提過了,由於 Visual Studio 2022 在更新到 17.10 後、把內部的 C++ / Toolset 版本進版到 19.40/14.40,把本來的 193 / 143 這種判斷 Visual Studio 版本的機制搞爛了,所以導致在只有安裝 Visual Studio 2022 17.10 的系統上,要建置 Boost C++ Libraries 的時候,會出現偵測不到環境的問題。
本來要建置 Boost C++ Libraries,基本上就是先到官網下載原始碼解壓縮後,透過 Visual Studio 的開發環境提示字元(Developer Command Prompt for VS 2022),執行下面兩個指令就可以了:
.\bootstrap.bat .\b2.exe
其中,bootstrap.bat
這個腳本是用來建置 Boost 使用的建置工具 b2(GitHub)的,在建置出來後,就可以執行 b2.exe
來進行建置了。
當然,在執行 b2 的時候其實還有很多參數可以使用,比如說想要建置成 x86-64 的版本的話,就需要加上「address-model=64
」這個參數,不過這邊就不細講了。
而這次的問題呢,是在執行 b2 的時候理論上應該可以抓到 Visual Studio 的 C++ 開發環境、進行各種設定。但是在使用 Visual Studio 2022 17.10 的情況下,執行 b2 會出現下面的訊息:
Performing configuration checks - default address-model : none [1] - default architecture : none [1] Building the Boost C++ Libraries. - x86 : no [2] - arm : no [2] - mips1 : no [2] - power : no [2] - sparc : no [2] - cxx11_static_assert : no [2] - x86 : no [3] - arm : no [3] - mips1 : no [3] - power : no [3] - sparc : no [3] - cxx11_static_assert : no [3] - cxx11_variadic_templates : no [2] - cxx11_variadic_templates : no [3] - cxx11_hdr_ratio : no [2] - cxx11_hdr_ratio : no [3] - cxx20_hdr_concepts : no [2] - cxx20_hdr_concepts : no [3] error: No best alternative for libs/context/build/asm_sources with
<abi>ms <address-model>32 <asynch-exceptions>off <binary-format>pe
<boost.cobalt.executor>any_io_executor <boost.cobalt.pmr>std
<context-impl>fcontext <coverage>off <debug-store>object
<debug-symbols>on <embed-manifest-via>linker <embed-manifest>on
<exception-handling>on <extern-c-nothrow>off <inlining>off <link>static
<midl-robust>yes <midl-stubless-proxy>yes <optimization>off ....
可以看到,這邊所以偵測的結果都是 none 或 no,底下也有跳出錯誤…而之後也理所當然地建置不出來什麼東西。
同樣的問題在官方 GitHub 上野已經有「No support for msvc-toolset 14.4x (VS 2022, 17.10.x)」這個 issue 了。問題也已經被釐清了,基本上就是因為 b2 的建置腳本在 Visual Studio 的版本判斷腳本(檔案是 tools/build/src/tools/msvc.jam
)裡面,是把 14.3 當成 Visual Studio 2022、把 14.2 當成 2019 這樣的形式。
而由於 Visual Studio 2022 17.10 把版本進版到 14.40 了,結果就變成他取前三個數字出來變成 14.4、然後就沒辦法正確判斷版本了。
由於這個問題很單純,再加上只是建置系統的腳本,所以要繞過去就變得很簡單了~這邊只要開啟 tools/build/src/tools/msvc.jam
這個檔案,然後:
-
搜尋「
(14.3)
」這個字串,應該會找下面的判斷式(1.85.0 的應該是在 1140 行):if [ MATCH "(14.3)" : $(version) ] { if $(.debug-configuration) { ECHO "notice: [generate-setup-cmd] $(version) is 14.3" ; } parent = [ path.native [ path.join $(parent) "..\\..\\..\\..\\..\\Auxiliary\\Build" ] ] ; }
-
然後把這邊加上 14.4 的判斷就可以了:
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" ] ] ; } else if [ MATCH "(14.3)" : $(version) ] { if $(.debug-configuration) { ECHO "notice: [generate-setup-cmd] $(version) is 14.3" ; } parent = [ path.native [ path.join $(parent) "..\\..\\..\\..\\..\\Auxiliary\\Build" ] ] ; }
這邊黃色的字是新增的,可以複製本來的內容,只是記得「14.3」要改成「14.4」。
之後存檔後,重新執行 b2.exe
就可以完成建置了~
不過個人覺得比較有趣的,是這邊建置出來的 .lib
檔案都還是掛著 vc143
這樣的版本,就不知道這個版本是哪來的?
這邊算是自己簡單修改、讓他可以先建置了。
而實際上,b2 那邊似乎也已經有做修改(issue)了?不過修改的方法算是有點差異就是了(merge)。
總之,對於一般的開發者來說,主要應該就是等 Boost 下次更新吧~ XD