索引
取得 Boost 副本最可靠的方式是從 SourceForge 下載發行版本
在您要放置 Boost 安裝檔的目錄中,執行
tar --bzip2 -xf /path/to/boost_1_82_0.tar.bz2
其他套件
RedHat、Debian 和其他發行版套件管理員提供 Boost 函式庫套件,但是如果您使用第三方套件,您可能需要調整這些說明,因為它們的建立者通常會選擇將 Boost 分解成多個套件、重新組織 Boost 發行版本的目錄結構,和/或重新命名函式庫二進位檔。1 如果您有任何問題,我們建議使用來自 SourceForge 的官方 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
請務必注意以下事項
到 boost 根目錄的路徑 (通常是/usr/local/boost_1_82_0) 有時在文件和郵件列表中稱為$BOOST_ROOT。
要編譯 Boost 中的任何內容,您需要在boost/路徑中有一個包含#include子目錄的目錄。`` ``
由於所有 Boost 的標頭檔都有.hpp副檔名,並且位於 boost 根目錄的boost/子目錄中,您的 Boost#include指令看起來會像
#include <boost/whatever.hpp>
或
#include "boost/whatever.hpp"
,具體取決於您對使用角括號包含的偏好。`` ``
不要被doc/子目錄分心;它只包含 Boost 文件的一部分。如果您正在尋找完整的內容,請從libs/index.html開始。
許多人首先想知道的是:「我該如何建置 Boost?」好消息是,通常情況下,沒有任何東西需要建置。
沒有東西需要建置?
大多數 Boost 函式庫都是僅標頭檔:它們完全由包含範本和內聯函式的標頭檔組成,並且在連結時不需要單獨編譯的函式庫二進位檔或特殊處理。
必須單獨建置的 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
如果您想使用任何單獨編譯的 Boost 函式庫,您需要取得函式庫二進位檔。
在 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 根目錄。
如果您使用不是系統預設的編譯器,則需要使用 Boost.Build 來建立二進位檔。
如果您需要非標準的建置變體,也可以使用此方法(有關更多詳細資訊,請參閱 Boost.Build 文件)。
Boost.Build 是一個基於文字的系統,用於開發、測試和安裝軟體。首先,您需要建置並安裝它。要執行此操作
首先,在下表中找到與您的編譯器對應的工具組(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.0或borland-5.4.3。
Boost.Build 會將它在建置時產生的所有中間檔放置在 建置目錄 中。如果您的 Boost 根目錄是可寫入的,則此步驟並非絕對必要:預設情況下,Boost.Build 會在您目前的工作目錄中建立一個bin.v2/子目錄以達到此目的。
將您目前的工作目錄變更為 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
特別是,為了限制花在建置上的時間,您可能會對
注意
Boost.Build 可以產生大量的輸出,這可能會讓人容易錯過問題。如果您想確保一切順利,可以透過在您的命令列附加 “>build.log 2>&1” 將輸出重新導向至檔案。
在建置 Boost 程式庫的過程中,您可以預期會在主控台中看到一些訊息。這些訊息可能包括:
關於 Boost 程式庫組態的注意事項 — 例如,Regex 程式庫在未建置 Unicode 支援時會輸出關於 ICU 的訊息,而且如果沒有安裝 Python,Python 程式庫可能會被略過而不會產生錯誤(但會顯示注意事項)。
來自建置工具的訊息,會報告已建置或略過的目標數量。如果這些數字對您來說沒有任何意義,請不要感到驚訝;每個程式庫都有許多目標。
描述工具正在執行的建置動作訊息,看起來像這樣:
toolset-name.c++ long/path/to/file/being/built
編譯器警告。
您在建置 Boost 時看到的唯一錯誤訊息(如果有的話)應與 IOStreams 程式庫對 zip 和 bzip2 格式的支援相關,如此處所述。如果您需要這些功能,請安裝 libz 和 libbz2 的相關開發套件。建置 Boost 程式庫時的其他錯誤則需要注意。
如果建置系統似乎找不到您的編譯器和/或連結器,請考慮設定一個user-config.jam檔案,如此處所述。如果這不是您的問題,或者user-config.jam檔案對您不起作用,請將關於為您的編譯器組態 Boost 的問題發佈到 Boost 使用者郵件清單。
為了示範如何連結到 Boost 二進位程式庫,我們將使用以下簡單程式,該程式會從電子郵件中擷取主旨行。它使用 Boost.Regex 程式庫,該程式庫具有單獨編譯的二進位元件。
#include <boost/regex.hpp> #include <iostream> #include <string> int main() { std::string line; boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" ); while (std::cin) { std::getline(std::cin, line); boost::smatch matches; if (boost::regex_match(line, matches, pat)) std::cout << matches[2] << std::endl; } }
與連結相關的兩個主要挑戰是:
有兩種連結到程式庫的主要方法:
您可以指定每個程式庫的完整路徑
$ c++ -I path/to/boost_1_82_0 example.cpp -o example \ ~/boost/stage/lib/libboost_regex-gcc34-mt-d-1_36.a
您可以分別指定要搜尋的目錄(使用-L目錄),以及要搜尋的程式庫名稱(使用-l程式庫,2刪除檔案名稱開頭的lib和結尾的後綴(.a在此情況下)
$ c++ -I path/to/boost_1_82_0 example.cpp -o example \ -L~/boost/stage/lib/ -lboost_regex-gcc34-mt-d-1_36
如您所見,對於一個程式庫而言,此方法與方法 A 一樣簡潔;當您從同一個目錄使用多個程式庫時,它 確實 非常值得。但是請注意,如果您將此方法與同時具有靜態 (.a) 和動態 (.so) 建置的程式庫搭配使用,系統可能會自動為您選擇其中一個,除非您在命令列上傳遞特殊的選項,例如-static。
在上述兩種情況下,粗體文字是您要新增到 我們稍早探討的命令列的內容。
為了為您的建置組態選擇正確的二進位檔,您需要知道 Boost 二進位檔的命名方式。每個程式庫檔案名稱都由一連串描述其建置方式的通用元素組成。例如:libboost_regex-vc71-mt-d-x86-1_34.lib可以分解成以下元素:
ABI 標籤:會編碼影響程式庫與其他編譯程式碼互通性的詳細資料。對於每個這類功能,都會將一個字母新增到標籤中。
鍵 在以下情況下使用此程式庫 Boost.Build 選項 s 靜態連結到 C++ 標準程式庫和編譯器執行時間支援程式庫時。 runtime-link=static g 使用標準和執行時間支援程式庫的偵錯版本時。 runtime-debugging=on y 使用特殊的 Python 偵錯建置時。 python-debugging=on d 建置程式碼的偵錯版本。5 variant=debug p 使用 STLPort 標準程式庫而不是您的編譯器提供的預設程式庫時。 stdlib=stlport
例如,如果您建置程式碼的偵錯版本以用於靜態執行時間程式庫的偵錯版本和 STLPort 標準程式庫,則標籤將為:-sgdp。如果以上皆不適用,則會省略 ABI 標籤。
架構和位址模型標籤:在第一個字母中,會將架構編碼如下:
鍵 架構 Boost.Build 選項 x x86-32、x86-64 architecture=x86 a ARM architecture=arm i IA-64 architecture=ia64 s Sparc architecture=sparc m MIPS/SGI architecture=mips* p RS/6000 和 PowerPC architecture=power
字母後面的兩位數會將位址模型編碼如下:
鍵 位址模型 Boost.Build 選項 32 32 位元 address-model=32 64 64 位元 address-model=64
為了測試我們的主旨擷取功能,我們將篩選以下文字檔案。請將其從您的瀏覽器複製出來,並儲存為:jayne.txt:
To: George Shmidlap From: Rita Marlowe Subject: Will Success Spoil Rock Hunter? --- See subject.
如果您連結到共享程式庫,您可能需要準備一些平台特定的設定,以便系統在您的程式執行時能夠找到並載入它。大多數平台都有一個環境變數,您可以將包含程式庫的目錄新增到該變數中。在許多平台(Linux、FreeBSD)上,該變數是LD_LIBRARY_PATH,但在 MacOS 上是DYLD_LIBRARY_PATH,而在 Cygwin 上則只是PATH。在csh和和tcsh$以外的大多數 shell 中,您可以按照如下方式調整變數(再次提醒,請勿輸入
$ VARIABLE_NAME=path/to/lib/directory:${VARIABLE_NAME} $ export VARIABLE_NAME
— 代表 shell 提示符):csh和和在
$ setenv VARIABLE_NAME path/to/lib/directory:${VARIABLE_NAME}
上,它是
$ path/to/compiled/example < path/to/jayne.txt
該程式應該會回應電子郵件主旨「Will Success Spoil Rock Hunter?」。
這結束了您對 Boost 的簡介,以及將它與您的程式整合的方式。當您開始認真使用 Boost 時,肯定還有一些我們希望涵蓋的額外重點。有一天,我們可能會推出「入門系列第 2 冊」,其中會解決這些問題。在此之前,我們建議您尋求以下資源。如果您找不到您需要的內容,或者有任何我們可以改進此文件清晰度的地方,請將其發佈到 Boost 使用者郵件清單。
前進
祝您好運,玩得開心!
— Boost 開發人員
[1] | 如果 Boost 套件的開發人員希望與我們合作,以確保這些說明可以與他們的套件搭配使用,我們很樂意提供協助。請將您的興趣告知 Boost 開發人員清單。 |
[2] | 該選項是一個連字符號,後跟一個小寫字母「L」,在某些字體中看起來很像數字 1。 |
[3] | 請記住,警告訊息是針對每個編譯器實作而定的。特定的 Boost 函式庫開發者可能無法存取您的編譯器。此外,有些警告在通用程式碼中極難消除,以至於不值得花費精力。最後,有些編譯器沒有任何原始碼機制可以抑制警告。 |
[4] | 此慣例區分了 Boost 函式庫的靜態版本和相同設定的 Boost DLL 的匯入函式庫,後者否則會具有相同的名稱。 |
[5] | 這些函式庫的編譯未經最佳化或內聯處理,啟用了完整除錯符號,且沒有NDEBUG #defined。 雖然有時這些選擇確實不會影響與其他已編譯程式碼的二進位相容性,但在 Boost 函式庫中,您不能依賴這種情況。 |