使用 gcc 建置 Boost 時開啟 c++11 的功能

| | 0 Comments| 09:31
Categories:

Heresy 在 2010 年開始使用 Boost C++ Libraries(官網)的時候,已經有寫過一篇《Boost C++ Libraries 簡介》,大致介紹過這套半 C++ 官方的函式庫集合,以及他的建置方法了。

而之後,其實也有寫了不少文章,來介紹裡面的一些函式庫(參考)。

至於這一篇呢,則是簡單紀錄一下,在 Linux 環境下如果想要自行建置 Boost 的話,要怎麼開啟 c++11 的支援。

首先,在使用 Boost 的 b2(bjam)來建置 Boost 的函式庫的時候,他都會先進行系統的檢查,在一開始會輸出類似下面的內容:

Performing configuration checks
    - 32-bit                   : no
    - 64-bit                   : yes
    - arm                      : no
    - mips1                    : no
    - power                    : no
    - sparc                    : no
    - x86                      : yes
Building the Boost C++ Libraries.
    - symlinks supported       : yes
    - C++11 mutex              : no
    - lockfree boost::atomic_flag : yes
    - Boost.Config Feature Check: cxx11_auto_declarations : no
    - Boost.Config Feature Check: cxx11_constexpr : no
    - Boost.Config Feature Check: cxx11_defaulted_functions : no
    - Boost.Config Feature Check: cxx11_final : no
    - Boost.Config Feature Check: cxx11_hdr_mutex : no
    - Boost.Config Feature Check: cxx11_hdr_tuple : no
    - Boost.Config Feature Check: cxx11_lambdas : no
    - Boost.Config Feature Check: cxx11_noexcept : no
    - Boost.Config Feature Check: cxx11_nullptr : no
    - Boost.Config Feature Check: cxx11_rvalue_references : no
    - Boost.Config Feature Check: cxx11_template_aliases : no
    - Boost.Config Feature Check: cxx11_thread_local : no
    - Boost.Config Feature Check: cxx11_variadic_templates : no
    - has_icu builds           : no
warning: Graph library does not contain MPI-based parallel components.
note: to enable them, add "using mpi ;" to your user-config.jam
    - zlib                     : yes
    - bzip2                    : no

一般 Linux 環境下預設的編譯器應該還是 gcc,而由於 gcc 預設沒有開啟 c++11 的功能,所以可以看到,再進行功能偵測的時候,C++11、cxx11 的相關結果都是不支援的。

而如果想要讓 Boost 在支援 C++11 的情況下建置的話,則是需要手動加入 gcc 的編譯參數。這邊的指令是:

./b2 cxxflags="--std=c++11"

也就是透過「cxxflags」來指定編譯階段的額外參數;而這邊加入的參數是「–std=c++11」,如果有必要也可以改成更新的「c++14」或「c++17」(不過就得看 gcc 的版本有沒有支援了)。

而如果不想用 gcc,而想用 clang 來建置的話,則可以再加上「toolset=clang」的參數,來指定要使用的編譯工具。


而這邊比較麻煩的是,如果一開始沒有加上「cxxflags」的參數的話,b2 會把第一次偵測到的參數快取下來,之後就算再加上參數,也沒有用。

下面就是一個例子:

./b2 cxxflags="--std=c++11"
Performing configuration checks
    - 32-bit                   : no  (cached)
    - 64-bit                   : yes (cached)
    - arm                      : no  (cached)
    - mips1                    : no  (cached)
    - power                    : no  (cached)
    - sparc                    : no  (cached)
    - x86                      : yes (cached)
Building the Boost C++ Libraries.
    - symlinks supported       : yes
    - C++11 mutex              : no  (cached)
    - lockfree boost::atomic_flag : yes (cached)
    - Boost.Config Feature Check: cxx11_auto_declarations : no  (cached)
    - Boost.Config Feature Check: cxx11_constexpr : no  (cached)
    - Boost.Config Feature Check: cxx11_defaulted_functions : no  (cached)
    - Boost.Config Feature Check: cxx11_final : no  (cached)
    - Boost.Config Feature Check: cxx11_hdr_mutex : no  (cached)
    - Boost.Config Feature Check: cxx11_hdr_tuple : no  (cached)
    - Boost.Config Feature Check: cxx11_lambdas : no  (cached)
    - Boost.Config Feature Check: cxx11_noexcept : no  (cached)
    - Boost.Config Feature Check: cxx11_nullptr : no  (cached)
    - Boost.Config Feature Check: cxx11_rvalue_references : no  (cached)
    - Boost.Config Feature Check: cxx11_template_aliases : no  (cached)
    - Boost.Config Feature Check: cxx11_thread_local : no  (cached)
    - Boost.Config Feature Check: cxx11_variadic_templates : no  (cached)

可以看到,他所有檢查結果都面都加上了「cached」的字樣。

而要怎麼讓他重新去檢查呢?最簡單的方法,似乎就是把 boost 目錄下的「bin.v2」資料夾整個砍掉了…這邊的指令是:

rm -rf bin.v2

再把這個資料夾砍掉後,再重新執行 b2,他就會去重新做檢查了。


話說 C++11 的標準函式庫,其實已經包含很多 Boost 的函式庫了。

不知道有沒有可能簡化 Boost 的函式庫,讓他去使用標準函式庫?如果這樣的話,Boost 應該可以被大幅簡化吧~

雖然 Boost 本身是有 BCP 這個工具(網頁)可以把指定的函式庫、以及他需要的函式庫都抽出來,不過基本上還是會有很多功能和標準函式庫重疊的東西,所以有點和需求不同…


參考:《Build boost 1.64.0 with c++11

Leave a Reply

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