Boost C++ 函式庫

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

Windows 入門指南

CygwinMinGW 使用者的注意事項

如果您計劃從 Windows 命令提示字元使用您的工具,那麼您來對地方了。如果您計劃從 Cygwin bash shell 建置,您實際上是在 POSIX 平台上執行,應該遵循 Unix 變體的入門指南。其他命令 shell,例如 MinGW 的 MSYS,不受支援——它們可能可以運作,也可能不行。

索引

1   取得 Boost

取得 Boost 最可靠的方式是下載 boost_1_82_0.7zboost_1_82_0.zip 並解壓縮以安裝完整的 Boost 發行版。1

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
   lib\ .....................precompiled library binaries
   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 根目錄 (通常是C:\Program Files\boost\boost_1_82_0) 的路徑有時在文件和郵件清單中被稱為$BOOST_ROOT

  2. 若要編譯 Boost 中的任何內容,您需要一個包含boost\子目錄的目錄#include路徑中。稍後將在本文件中提供設定#includeMicrosoft Visual Studio 中的路徑的特定步驟;如果您使用其他 IDE,請參閱您產品的文件以取得說明。

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

    #include <boost/whatever.hpp>
    

    #include "boost/whatever.hpp"
    

    這取決於您對使用角括號 include 的偏好。即使是 Windows 使用者也可以 (而且,為了可移植性的原因,可能應該) 在#include指示詞中使用正斜線;您的編譯器並不在意。

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

3   僅標頭檔函式庫

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

沒有東西需要建置?

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

必須單獨建置的唯一 Boost 函式庫是

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

4   使用 Boost 建置簡單的程式

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

#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.

的檔案中

若要建置本指南中的範例,您可以使用整合開發環境 (IDE),例如 Visual Studio,或者您可以從命令提示字元發出命令。由於每個 IDE 和編譯器都有不同的選項,而且 Microsoft 的是 Windows 上最主要的編譯器,因此我們在這裡只提供 Visual Studio 2005 和 .NET 2003 IDE 及其各自的命令提示字元編譯器 (使用命令提示字元會比較簡單) 的特定方向。如果您使用的是其他編譯器或 IDE,應該可以相對輕鬆地將這些說明調整到您的環境。

4.1   從 Visual Studio IDE 建置

  • 從 Visual Studio 的檔案功能表中,選取新增 > 專案…

  • 在產生的新增專案對話方塊的左側窗格中,選取Visual C++ > Win32

  • 在右側窗格中,選取Win32 主控台應用程式 (VS8.0) 或Win32 主控台專案 (VS7.1)。

  • 名稱欄位中,輸入「example」

  • 方案總管窗格中,以滑鼠右鍵按一下 example,然後從產生的快顯功能表中選取內容

  • 組態屬性 > C/C++ > 一般 > 其他包含目錄中,輸入 Boost 根目錄的路徑,例如

    C:\Program Files\boost\boost_1_82_0

  • 組態屬性 > C/C++ > 先行編譯標頭中,將使用先行編譯標頭 (/Yu) 變更為不使用先行編譯標頭2

  • 取代產生的example.cppIDE 使用上述範例程式碼所產生的內容。

  • 建置功能表中,選取建置方案

若要測試您的應用程式,請按下 F5 鍵,然後在產生的視窗中輸入下列內容,後接 Return 鍵

1 2 3

然後按住 Ctrl 鍵並按下「Z」,後接 Return 鍵。

跳到下一個步驟

4.2   或者,從命令提示字元建置

從您電腦的開始功能表,如果您是 Visual Studio 2005 使用者,請選取

所有程式 > Microsoft Visual Studio 2005 > Visual Studio Tools > Visual Studio 2005 命令提示字元

或者,如果您是 Visual Studio .NET 2003 使用者,請選取

所有程式 > Microsoft Visual Studio .NET 2003 > Visual Studio .NET Tools > Visual Studio .NET 2003 命令提示字元

以顯示針對 Visual Studio 編譯器設定的特殊命令提示字元視窗。在該視窗中,將目前目錄設定為適合建立一些暫存檔的位置,並輸入以下命令,後接 Return 鍵

cl /EHsc /I path\to\boost_1_82_0 path\to\example.cpp

若要測試結果,請輸入

echo 1 2 3 | example

4.3   錯誤和警告

如果你看到編譯器警告訊息來自 Boost 標頭檔,請不要驚慌。我們盡力消除這些警告,但這麼做並不總是實際可行的。4 錯誤是另一回事。如果你在本教學的此時看到編譯錯誤,請檢查你是否正確複製了範例程式,以及是否正確識別了Boost 根目錄

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

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

5.1   簡化從原始碼建置

如果你希望使用 Visual C++ 從原始碼建置,你可以使用本節中描述的簡單建置程序。開啟命令提示字元,並將目前目錄變更為 Boost 根目錄。然後,輸入以下命令

bootstrap
.\b2

第一個命令準備 Boost.Build 系統以供使用。第二個命令呼叫 Boost.Build 來建置單獨編譯的 Boost 函式庫。請查閱Boost.Build 文件,以取得允許選項的列表。

5.2   或者,從原始碼建置二進位檔

如果你使用的是較早版本的 Visual C++,或是來自其他供應商的編譯器,則需要使用Boost.Build 來建立你自己的二進位檔。

5.2.1   安裝 Boost.Build

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

  1. 前往目錄tools\build\.
  2. 執行bootstrap.bat
  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 The Gnu Project 包括對 Cygwin 和 MinGW 編譯器的支援。
hp_cxx Hewlett Packard 目標為 Tru64 作業系統。
intel Intel  
msvc Microsoft  
sun Oracle 已知只有非常新的版本才能與 Boost 良好運作。請注意,Oracle/Sun 編譯器具有大量會影響二進位相容性的選項:至關重要的是,函式庫的建置選項必須與你的應用程式將使用的選項相同。特別要注意的是,除非你是針對 C++11 建置,否則預設的標準函式庫可能無法與 Boost 良好運作。 你需要的特定編譯器選項可以使用 b2 命令列選項注入cxxflags=``和 ``linkflags=。例如,若要在 C++03 模式下使用 Apache 標準函式庫建置,請使用b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4.
vacpp IBM VisualAge C++ 編譯器。

如果安裝了特定編譯器的多個版本,你可以將版本號碼附加到工具集名稱,並以連字號分隔,例如intel-9.0borland-5.4.3在 Windows 上,即使你只安裝了一個版本,也要附加版本號碼 (除非你使用 msvc 或 gcc 工具集,它們具有特殊的版本偵測程式碼),否則自動連結將會失敗。

5.2.3   選擇建置目錄

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

5.2.4   呼叫b2

將目前目錄變更為 Boost 根目錄,並呼叫b2如下所示

b2 --build-dir=build-directory toolset=toolset-name --build-type=complete stage

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

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

C:\WINDOWS> cd C:\Program Files\boost\boost_1_82_0
C:\Program Files\boost\boost_1_82_0> b2 ^
More? --build-dir="C:\Documents and Settings\dave\build-boost" ^
More? --build-type=complete msvc stage

請務必閱讀關於^, 更多?和該行中的引號 (") 的此註解

--build-type=complete” 選項會使 Boost.Build 建置函式庫的所有支援變體。如需如何僅建置特定變體的說明,請在Boost 使用者郵件論壇上發問。

建置特殊的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 時,肯定會有幾個您希望我們涵蓋的其他重點。有一天我們可能會推出「入門系列中的第二本書」,來解決這些問題。在此之前,我們建議您參考以下資源。如果您找不到您需要的內容,或者有任何我們可以讓這份文件更清楚的地方,請將其發佈到 Boost 使用者郵件論壇

向前邁進

祝您好運,玩得開心!

—Boost 開發人員


[1]我們建議下載 boost_1_82_0.7z 並使用 7-Zip 解壓縮。我們不再建議使用 .zip 檔案來儲存 Boost,因為它們是等效 .7z 檔案的兩倍大。我們不建議使用 Windows 內建的解壓縮功能,因為對於大型封存檔,它可能非常慢。
[2]使用 Boost 時使用預先編譯標頭沒有問題;這些說明只是為了避免使用預先編譯標頭,因為這會需要對範例中使用的原始碼進行 Visual Studio 特有的變更。
[3]

在此範例中,插入符號字元^是一種將命令延續到多行的方法,並且必須是待延續行的最後一個字元(即,請勿在其後加上空格)。命令提示字元會以更多?回應,以提示更多輸入。您可以省略插入符號和後續的換行符號;我們使用它們是為了讓範例符合合理的頁面寬度。

命令提示字元將命令中的每個空格視為參數分隔符號。這表示當單個命令列引數包含空格時,需要使用引號 (") 來將文字組合在一起,例如

--build-dir="C:\Documents_and_Settings\dave\build-boost"

此外,例如,您不能在=符號周圍新增空格,例如

--build-dir_=_"C:\Documents and Settings\dave\build-boost"
[4]請記住,警告是特定於每個編譯器實作的。給定 Boost 程式庫的開發人員可能無法存取您的編譯器。此外,有些警告在通用程式碼中非常難以消除,以至於不值得花費時間。最後,有些編譯器沒有任何用於抑制警告的原始碼機制。
[5]此慣例將 Boost 程式庫的靜態版本與具有相同名稱的相同設定 Boost DLL 的匯入程式庫區分開來。
[6]這些程式庫是在沒有最佳化或內嵌的情況下編譯的,啟用了完整偵錯符號,並且沒有NDEBUG #defined。雖然有些時候這些選擇確實不會影響與其他編譯程式碼的二進位相容性,但您不能指望 Boost 程式庫會這樣。