Boost C++ 函式庫

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

BCP

John Maddock

依據 Boost 軟體授權條款 1.0 版發布。(請參閱隨附的 LICENSE_1_0.txt 檔案或複製於 https://boost.dev.org.tw/LICENSE_1_0.txt)


目錄

概觀
範例
語法
行為選擇
選項
模組列表
輸出路徑
相依性

bcp 工具是一個用於提取 Boost 子集的工具,它對想要將其函式庫與 Boost 分開發行的 Boost 作者很有用,並且對想要將 Boost 子集與其應用程式一起發行的 Boost 使用者也很有用。

bcp 也可以報告您的程式碼依賴於 Boost 的哪些部分,以及這些相依性使用的授權。

bcp scoped_ptr /foo

將 boost/scoped_ptr.hpp 和相依性複製到 /foo。

bcp boost/regex.hpp /foo

將 boost/regex.hpp 和所有相依性(包括 regex 原始碼 (在 libs/regex/src 中) 和建置檔案 (在 libs/regex/build 中))複製到 /foo。不複製 regex 文件、測試或範例程式碼。也不複製 Boost.Build 系統。

bcp regex /foo

將完整的 regex 函式庫 (在 libs/regex 中) 包括相依性(例如 regex 測試程式所需的 boost.test 原始碼)複製到 /foo。不複製 Boost.Build 系統。

bcp --namespace=myboost --namespace-alias regex config build /foo

將完整的 regex 函式庫 (在 libs/regex 中) 加上 config 函式庫 (libs/config) 和建置系統 (tools/build) 複製到 /foo,包括所有相依性。同時將 boost 命名空間重新命名為 myboost,並將二進位函式庫的檔名變更為以 "myboost" 而非 "boost" 作為前綴。--namespace-alias 選項會使 namespace boost 成為新名稱的別名。

bcp --scan --boost=/boost foo.cpp bar.cpp boost

掃描 [非 Boost] 檔案 foo.cpp 和 bar.cpp 的 Boost 相依性,並將這些相依性複製到子目錄 boost。

bcp --report regex.hpp boost-regex-report.html

為 Boost 模組 regex.hpp 建立名為 boost-regex-report.html 的 HTML 報告。該報告包含授權資訊、作者詳細資訊和檔案相依性。

bcp --list [options] module-list

輸出 module-list 中所有檔案的清單,包括相依性。

bcp [options] module-list output-path

將 module-list 中找到的所有檔案複製到 output-path

bcp --report [options] module-list html-file

輸出包含以下內容的 HTML 報告檔案

  • 所有有效的授權,以及使用每個授權的檔案,以及使用每個授權的版權持有人。
  • 任何沒有可識別授權的檔案(請將這些報告給 Boost 郵件列表)。
  • 任何沒有可識別版權持有人的檔案(請將這些報告給 Boost 郵件列表)。
  • 所有版權持有人及其擁有版權的檔案。
  • 檔案相依性資訊 - 指示在找到的相依性中包含任何特定檔案的原因。
--boost=path

將 Boost 樹的位置設定為 path。如果未提供此選項,則假定目前路徑是 Boost 樹的根目錄。

--namespace=newname 

複製檔案時,所有出現的 Boost 命名空間都會重新命名為 "newname"。同時會將 Boost 二進位檔重新命名為使用 "newname" 而非 "boost" 作為前綴。

通常與 --namespace-alias 選項結合使用,這允許在同一個程式中使用兩個不同的 Boost 版本,但不能在同一個轉譯單元中使用。

--namespace-alias

與 --namespace 選項結合使用時,namespace boost 將被宣告為新命名空間名稱的別名。這允許依賴於 namespace boost 中的 Boost 程式碼的現有程式碼保持不變地編譯,同時保留透過命名空間變更可以實現的「強版本控制」。

--scan

將模組列表視為要掃描 Boost 相依性的(可能是非 Boost)檔案清單,模組列表中列出的檔案不會被複製(或列出),只會複製它們所依賴的 Boost 檔案。

--svn

僅複製在 SVN 版本控制下的檔案。

--unix-lines

確保所有複製的檔案都使用 Unix 風格的行尾。

當未使用 --scan 選項時,要複製的 Boost 檔案或函式庫名稱的清單,它可以是

  1. 工具的名稱:例如 "build" 將找到 "tools/build"。
  2. 函式庫的名稱:例如 "regex"。
  3. 標頭的標題:例如 "scoped_ptr" 將找到 "boost/scoped_ptr.hpp"。
  4. 標頭的名稱:例如 "scoped_ptr.hpp" 將找到 "boost/scoped_ptr.hpp"。
  5. 檔案的名稱:例如 "boost/regex.hpp"。

當使用 --scan 選項時,則是要掃描 Boost 相依性的(可能是非 Boost)檔案清單,因此不會複製/列出模組列表中的檔案。

將檔案複製到的路徑(此路徑必須存在)。

檔案相依性按如下方式找到

  • 掃描 C++ 原始碼檔案中的 #include,然後掃描 Boost 原始碼樹中存在的所有 #include 的相依性,依此類推。
  • C++ 原始碼檔案與函式庫的名稱相關聯,如果該函式庫具有原始碼(並且可能具有建置資料),則將該原始碼包含在相依性中。
  • 檢查 C++ 原始碼檔案是否依賴於 Boost.test(例如查看它們是否使用 cpp_main 作為進入點)。
  • 掃描 HTML 檔案的直接相依性(影像和樣式表,但不包括連結)。

應注意,實際上 bcp 可以產生相當「龐大」的相依性清單,原因包括

  • 它首先搜尋函式庫名稱,因此使用 "regex" 作為名稱將會提供 libs/regex 目錄中的所有內容以及依賴於該目錄的所有內容。這可能會是一個很長的清單,因為會掃描所有 regex 測試和範例程式的相依性。如果您想要更精簡的清單,請嘗試使用您實際包含的標頭名稱,或使用 --scan 選項來掃描您的原始碼。
  • 如果您包含具有獨立原始碼的函式庫的標頭,那麼您將會獲得該函式庫的原始碼及其所有相依性。這是刻意設計的,通常那些額外的相依性是必要的。
  • 當您包含標頭時,bcp 不知道您正在使用哪個編譯器,因此它會追蹤所有可能的預處理器路徑。如果您要將 Boost 的子集與您的應用程式一起發行,那麼一般情況下,這正是您想要發生的情況。

上面的最後一點可能會導致找到的標頭數量比大多數人預期的要多得多。例如,bcp 為 boost/shared_ptr.hpp 找到 274 個標頭相依性:透過在報告模式下執行 bcp,我們可以了解為何這些標頭都已被找到作為相依性

  • 包含所有 Config 函式庫標頭(52 個標頭,如果僅針對一個編譯器則約為 6 個)。
  • 許多 MPL 和類型特徵程式碼包含針對損壞編譯器的解決方法,您可能需要或不需要這些解決方法。回溯程式碼顯示,除非使用者定義了 BOOST_SP_USE_QUICK_ALLOCATOR,否則大多數這些程式碼都不需要,但是 bcp 並不知道是否會採用該預處理器路徑,因此會包含這些標頭以防萬一。這會增加約 48 個標頭(類型特徵),加上 MPL 的另外 49 個標頭。
  • 預處理器函式庫被 MPL 大量使用:這會增加另外 96 個標頭。
  • Shared Pointer 函式庫包含許多特定於平台的程式碼,分為大約 22 個標頭:通常您的編譯器只需要其中的幾個檔案。

如您所見,找到的相依性數量遠大於任何單一編譯器使用的相依性數量,但是如果您想要發行 Boost 的子集,使其可以在任何設定、任何編譯器和任何平台上使用,那麼這正是您所需要的。如果您想知道您的特定編譯器正在使用哪些 Boost 標頭,那麼最好的方法是預處理程式碼並掃描輸出的 Boost 標頭包含。您應該知道,結果將非常特定於平台和編譯器,並且如果您僅變更編譯器開關(例如開啟執行緒支援),則可能不包含所需的所有標頭。

最後修訂時間:2013 年 4 月 18 日,格林威治時間 12:30:13