Boost C++ 函式庫

...世界上最受推崇且設計精良的 C++ 函式庫專案之一。 Herb SutterAndrei Alexandrescu, C++ 編碼標準

Unix 變體入門指南

索引

1   取得 Boost

取得 Boost 副本最可靠的方式是從 SourceForge 下載發行版本

  1. 下載 boost_1_82_0.tar.bz2

  2. 在您要放置 Boost 安裝檔的目錄中,執行

    tar --bzip2 -xf /path/to/boost_1_82_0.tar.bz2
    

其他套件

RedHat、Debian 和其他發行版套件管理員提供 Boost 函式庫套件,但是如果您使用第三方套件,您可能需要調整這些說明,因為它們的建立者通常會選擇將 Boost 分解成多個套件、重新組織 Boost 發行版本的目錄結構,和/或重新命名函式庫二進位檔。1 如果您有任何問題,我們建議使用來自 SourceForge 的官方 Boost 發行版本。

2   Boost 發行版本

這是產生的目錄結構草圖

boost_1_82_0/ .................The “boost root directory”
   index.htm .........A copy of www.boost.org starts here
   boost/ .........................All Boost Header files
   `` ``
   libs/ ............Tests, .cpps, docs, etc., by library
     index.html ........Library documentation starts here
     algorithm/
     any/
     array/
                     …more libraries…
   status/ .........................Boost-wide test suite
   tools/ ...........Utilities, e.g. Boost.Build, quickbook, bcp
   more/ ..........................Policy documents, etc.
   doc/ ...............A subset of all Boost library docs

請務必注意以下事項

  1. boost 根目錄的路徑 (通常是/usr/local/boost_1_82_0) 有時在文件和郵件列表中稱為$BOOST_ROOT

  2. 要編譯 Boost 中的任何內容,您需要在boost/路徑中有一個包含#include子目錄的目錄。`` ``

  3. 由於所有 Boost 的標頭檔都有.hpp副檔名,並且位於 boost 根目錄的boost/子目錄中,您的 Boost#include指令看起來會像

    #include <boost/whatever.hpp>
    

    #include "boost/whatever.hpp"
    

    ,具體取決於您對使用角括號包含的偏好。`` ``

  4. 不要被doc/子目錄分心;它只包含 Boost 文件的一部分。如果您正在尋找完整的內容,請從libs/index.html開始。

3   僅標頭檔函式庫

許多人首先想知道的是:「我該如何建置 Boost?」好消息是,通常情況下,沒有任何東西需要建置。

沒有東西需要建置?

大多數 Boost 函式庫都是僅標頭檔:它們完全由包含範本和內聯函式的標頭檔組成,並且在連結時不需要單獨編譯的函式庫二進位檔或特殊處理。

必須單獨建置的 Boost 函式庫只有

一些函式庫有可選的單獨編譯二進位檔

4   使用 Boost 建置簡單程式

為了保持簡單,我們先從使用僅標頭檔函式庫開始。以下程式碼從標準輸入讀取一連串整數,使用 Boost.Lambda 將每個數字乘以 3,然後將它們寫入標準輸出

#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator<int> in;

    std::for_each(
        in(std::cin), in(), std::cout << (_1 * 3) << " " );
}

將此程式碼的文字複製到名為example.cpp.

的檔案中,現在,在您儲存example.cpp的目錄中,發出以下命令

c++ -I path/to/boost_1_82_0 example.cpp -o example

要測試結果,請輸入

echo 1 2 3 | ./example

4.1   錯誤和警告

如果您看到源自 Boost 標頭的編譯器警告,請不要驚慌。我們嘗試消除它們,但這樣做並不總是實際的。3 錯誤是另一回事。如果您在此教學的這一點看到編譯錯誤,請檢查以確保您已正確複製範例程式,並且您已正確識別 Boost 根目錄

5   準備使用 Boost 函式庫二進位檔

如果您想使用任何單獨編譯的 Boost 函式庫,您需要取得函式庫二進位檔。

5.1   簡易建置和安裝

在 Shell 中發出以下命令(不要輸入$;這表示 Shell 的提示符號)

$ cd path/to/boost_1_82_0
$ ./bootstrap.sh --help

選擇您的設定選項並調用./bootstrap.sh再次,不使用--help選項。除非您在系統的/usr/local/目錄中具有寫入權限,否則您可能至少要使用

$ ./bootstrap.sh --prefix=path/to/installation/prefix

安裝到其他地方。此外,請考慮使用--show-libraries--with-libraries=函式庫名稱清單選項,以限制您在建置所有內容時會經歷的漫長等待。最後,

$ ./b2 install

將把 Boost 二進位檔留在您安裝前置詞的lib/子目錄中。您還會在安裝前置詞的include/子目錄中找到 Boost 標頭的副本,因此您可以從此將該目錄用作#include路徑,而不是 Boost 根目錄。

跳至下一個步驟

5.2   或者,建置自訂二進位檔

如果您使用不是系統預設的編譯器,則需要使用 Boost.Build 來建立二進位檔。

如果您需要非標準的建置變體,也可以使用此方法(有關更多詳細資訊,請參閱 Boost.Build 文件)。

5.2.1   安裝 Boost.Build

Boost.Build 是一個基於文字的系統,用於開發、測試和安裝軟體。首先,您需要建置並安裝它。要執行此操作

  1. 前往目錄tools/build/.
  2. 執行bootstrap.sh
  3. 執行b2 install --prefix=PREFIX,其中 PREFIX 是您要安裝 Boost.Build 的目錄
  4. PREFIX/bin新增至您的 PATH 環境變數。

5.2.2   識別您的工具組

首先,在下表中找到與您的編譯器對應的工具組(Boost.Build 文件中始終提供最新的清單)。

注意

如果您先前為了建置 b2 而選擇了工具組,您應該假設它無法運作,而是從下表中重新選擇。

工具組名稱 供應商 註解
acc Hewlett Packard 已知只有非常新的版本才能與 Boost 良好配合
borland Borland  
como Comeau Computing 使用此工具組可能需要設定另一個工具組來作為其後端。
darwin Apple Computer Apple 版本的 GCC 工具鏈,支援 Darwin 和 MacOS X 功能,例如框架。
gcc Gnu 專案 包括對 Cygwin 和 MinGW 編譯器的支援。
hp_cxx Hewlett Packard 針對 Tru64 作業系統。
intel Intel  
msvc Microsoft  
sun Oracle 已知只有非常新的版本才能與 Boost 良好配合。請注意,Oracle/Sun 編譯器具有大量影響二進位相容性的選項:至關重要的是,函式庫的建置選項必須與您的應用程式所使用的選項相同。特別注意,預設的標準函式庫可能無法與 Boost 良好配合,除非您是針對 C++11 建置。您需要的特定編譯器選項可以使用 b2 命令列選項來注入cxxflags=``和 ``linkflags=。例如,若要在 C++03 模式下使用 Apache 標準函式庫建置,請使用b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4.
vacpp IBM VisualAge C++ 編譯器。

如果您安裝了特定編譯器的多個版本,您可以在工具集名稱後附加版本號,並以連字符號分隔,例如:intel-9.0borland-5.4.3。 

5.2.3   選擇建置目錄

Boost.Build 會將它在建置時產生的所有中間檔放置在 建置目錄 中。如果您的 Boost 根目錄是可寫入的,則此步驟並非絕對必要:預設情況下,Boost.Build 會在您目前的工作目錄中建立一個bin.v2/子目錄以達到此目的。

5.2.4   調用b2

將您目前的工作目錄變更為 Boost 根目錄並調用b2如下:

b2 --build-dir=build-directory toolset=toolset-name `` `` stage

如需這些和其他調用選項的完整說明,請參閱 Boost.Build 文件

例如,您的工作階段可能如下所示:

$ cd ~/boost_1_82_0
$ b2 --build-dir=/tmp/build-boost toolset=gcc stage

這將建置靜態和共享的非除錯多執行緒程式庫變體。若要建置所有變體,請傳遞額外選項 “--build-type=complete”。

建置特殊的stage目標會將 Boost 程式庫二進位檔放置在 Boost 樹狀結構的stage/lib/子目錄中。若要使用不同的目錄,請將--stagedir=目錄 選項傳遞給b2.

注意

b2是區分大小寫的;重要的是,上面以 粗體 顯示的所有部分都必須完全是小寫字母。

如需關於調用時您可以傳遞的其他選項的說明b2,請輸入

b2 --help

特別是,為了限制花在建置上的時間,您可能會對

  • 使用以下選項檢閱程式庫名稱清單感興趣:--show-libraries
  • 使用以下選項限制要建置的程式庫:--with-程式庫名稱--without-程式庫名稱 選項
  • 透過將releasedebug新增至命令列來選擇特定的建置變體。

注意

Boost.Build 可以產生大量的輸出,這可能會讓人容易錯過問題。如果您想確保一切順利,可以透過在您的命令列附加 “>build.log 2>&1” 將輸出重新導向至檔案。

5.3   預期的建置輸出

在建置 Boost 程式庫的過程中,您可以預期會在主控台中看到一些訊息。這些訊息可能包括:

  • 關於 Boost 程式庫組態的注意事項 — 例如,Regex 程式庫在未建置 Unicode 支援時會輸出關於 ICU 的訊息,而且如果沒有安裝 Python,Python 程式庫可能會被略過而不會產生錯誤(但會顯示注意事項)。

  • 來自建置工具的訊息,會報告已建置或略過的目標數量。如果這些數字對您來說沒有任何意義,請不要感到驚訝;每個程式庫都有許多目標。

  • 描述工具正在執行的建置動作訊息,看起來像這樣:

    toolset-name.c++ long/path/to/file/being/built
    
  • 編譯器警告。

5.4   發生建置錯誤時

您在建置 Boost 時看到的唯一錯誤訊息(如果有的話)應與 IOStreams 程式庫對 zip 和 bzip2 格式的支援相關,如此處所述。如果您需要這些功能,請安裝 libz 和 libbz2 的相關開發套件。建置 Boost 程式庫時的其他錯誤則需要注意。

如果建置系統似乎找不到您的編譯器和/或連結器,請考慮設定一個user-config.jam檔案,如此處所述。如果這不是您的問題,或者user-config.jam檔案對您不起作用,請將關於為您的編譯器組態 Boost 的問題發佈到 Boost 使用者郵件清單

7   結論和更多資源

這結束了您對 Boost 的簡介,以及將它與您的程式整合的方式。當您開始認真使用 Boost 時,肯定還有一些我們希望涵蓋的額外重點。有一天,我們可能會推出「入門系列第 2 冊」,其中會解決這些問題。在此之前,我們建議您尋求以下資源。如果您找不到您需要的內容,或者有任何我們可以改進此文件清晰度的地方,請將其發佈到 Boost 使用者郵件清單

前進

祝您好運,玩得開心!

— Boost 開發人員


[1]如果 Boost 套件的開發人員希望與我們合作,以確保這些說明可以與他們的套件搭配使用,我們很樂意提供協助。請將您的興趣告知 Boost 開發人員清單
[2]該選項是一個連字符號,後跟一個小寫字母「L」,在某些字體中看起來很像數字 1。
[3]請記住,警告訊息是針對每個編譯器實作而定的。特定的 Boost 函式庫開發者可能無法存取您的編譯器。此外,有些警告在通用程式碼中極難消除,以至於不值得花費精力。最後,有些編譯器沒有任何原始碼機制可以抑制警告。
[4]此慣例區分了 Boost 函式庫的靜態版本和相同設定的 Boost DLL 的匯入函式庫,後者否則會具有相同的名稱。
[5]這些函式庫的編譯未經最佳化或內聯處理,啟用了完整除錯符號,且沒有NDEBUG #defined。 雖然有時這些選擇確實不會影響與其他已編譯程式碼的二進位相容性,但在 Boost 函式庫中,您不能依賴這種情況。