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