Linux下Boost安裝教學(3種方式)

2020-07-16 10:05:23
使用Boost,讀者需要一個能夠較好地支援 C++ 標準的作業系統和編譯器,之後才能編譯和安裝 Boost 程式庫。

C++ 是一種大型語言,十分複雜。雖然 C++98 標準已經面世二十餘年,C++11 標準也已經出台近十年,但仍然有很多編譯器未能實現 C++ 的全部特性。

由於 Boost 大量使用了 C++ 的高階特性,所以並非所有的編譯器都能夠很好地支援 Boost,並且每個元件對編譯器的支援都不盡相同。雖然 Boost 已經針對平台和編譯器的相容性做了大量的工作,但仍有可能出現意外情況。隨著 Boost 版本的增長,某些過“老”的編譯器(如 VC 6、VC 7、GCC 3)和 CPU 已經不再被支援。

在編寫本文時,筆者使用的作業系統是 Ubuntu 18.04.1,編譯器使用的是其自帶的 GCC 7.4.0,所有程式碼均在此環境中編譯通過。

筆者還在 GitHub 上使用 Travis-CI,基於 Ubuntu 16.04/GCC 5.4.0/Clang 7.0.0 執行通過了所有的程式碼。

Linux Boost 安裝

本文演示了三種 Linux Boost 安裝方式,大家可以根據自己的實際需求選擇。

1. 快捷安裝 Boost

在 Linux 作業系統下安裝 Boost 很容易,最簡單省事的方法是在 Boost 解壓縮後的目錄下直接執行以下命令:

./bootstrap.sh;./b2 install

第一條命令 bootstrap.sh 是編譯前的設定工作,第二條命令才開始真正地編譯並安裝 Boost。

得益於摩爾定律,現在 Boost 庫編譯所需要的時間和空間都大大縮減了,Boost 庫在目前主流級別的 CPU 上編譯只需要半小時左右,而以前則需要數個小時。

如果像上面這樣不指定額外選項,Boost 將編譯 release 版本的庫檔案,把標頭檔案安裝到“/usr/local/include”中,把庫檔案安裝到“/usr/local/lib”中。

2. 完全安裝 Boost

我們也可以完整編譯 Boost,使用 buildtype 選項指定編譯型別(如不指定編譯型別則預設使用 release 模式),在執行 bootstrap.sh 命令之後執行如下命令:

./b2 --buildtype=complete install

這樣將開始對 Boost 進行完整編譯,安裝所有偵錯版、發行版的靜態庫和動態庫。

3. 客製化安裝 Boost

完整編譯 Boost 費時費力,而且在開發過程中這些庫並不會全部用到,因此,Boost 允許使用者自行選擇使用者要編譯的庫。

執行命令:

./b2--show-libraries

可檢視所有必須編譯後才能使用的庫。

在完全編譯命令的基礎上,使用--with--without選項可開啟或關閉某個庫的編譯,如:

./b2--with-date_time--buildtype=complete install

執行上述命令將編譯安裝 date_time 庫。

筆者使用的安裝命令如下:

sudo ./b2 link=static install

b2 和 bootstrap.sh 還有很多其他選項,如指定安裝路徑、指定 debug 或 release 版等,讀者可以使用--help選項或參考 Boost 文件以獲得更多的資訊。

編譯驗證

讓我們來編寫一個簡單的 Boost 應用程式來驗證其開發環境。

標頭檔案 <boost/version.hpp> 裡有兩個宏,這兩個宏定義了當前使用的 Boost 程式庫的版本號:

#define BOOST_VERSION 107200  //數位形式的版本號
#define BOOST_LIB_VERSION "1_72"  //字串形式的版本號


標頭檔案 <boost/config.hpp> 裡的三個宏:BOOST_PLATFORM、BOOST_COMPILER 和 BOOST_STDLIB,分別定義了當前的作業系統、編譯器和標準庫。

下面的程式碼就是我們與 Boost 的第一次接觸(見 GitHub 倉庫的 common/test.cpp):
#include <boost/version.hpp>  //包含 Boost 標頭檔案
#include <boost/config.hpp>  //包含 Boost 標頭檔案

int main()
{
    cout << BOOST_VERSION << endl;  //Boost 版本號
    cout << BOOST_LIB_VERSION << endl;  //Boost 版本號
    cout << BOOST_PLATFORM << endl;  //作業系統
    cout << BOOST_COMPILER << endl;  //編譯器
    cout << BOOST_STDLIB << endl;  //標準庫

    return 0;
}
然後使用 g++ 編譯:

g++ -o a.out test.cpp -I.  #編譯test.cpp,生成a.out

程式的執行結果如下:

107200
1_72
linux
GNU C++ version 7.4.0
GNU libstdc++ version 20181206