使用 Visual Studio 2022 17.10 建置 Boost C++ Libraries

| | 0 Comments| 09:21
Categories:

之前在《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 這個檔案,然後:

  1. 搜尋「(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" ] ] ;
    }
  2. 然後把這邊加上 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

Leave a Reply

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