1. 程式人生 > >Boost(1.69.0) windows入門(譯)

Boost(1.69.0) windows入門(譯)

目錄

縮排2字元

Boost windows入門

基於版本1.69.0

1. 獲得Boost原始碼

獲取Boost副本最好的方法是下載boost_1_69_0.7zboost_1_69_0.zip並解壓縮以安裝完整的Boost發行版。

2. Boost原始碼組織 The Boost Distribution

這是Boost目錄結構草圖:

boost_1_69_0 \ ........................ “boost根目錄” 
   index.htm ................ 這是www.boost.org的副本
   boost \ ......................... 所有Boost 標頭檔案
   lib \ .......................... 預編譯庫二進位制檔案
   libs\ ................. 測試,.cpps,docs等,通過庫
     index.html ..................... 庫文件從這裡開始
     algorithm\ 
     any \ 
     array \ 
                     ...更多庫... 
   status\ .........................Boost-wide測試套件
   tools\ ........... 實用工具,例如Boost.Build,quickbook,bcp 
   more \ ................................. 政策檔案等
   doc \ ........................ 所有Boost庫文件的子集
標題組織
Boost庫頭的組織並不完全統一,但大多數庫遵循以下幾種模式:
- 一些較舊的庫和大多數非常小的庫將所有公共標頭檔案直接放入 `boost\`。
- 大多數庫的公共標頭檔案都位於`boost\`的子目錄中,以庫命名。例如,您將在中找到Python庫的`def.hpp`標頭
.    boost\python\def.hpp.
- 有些庫在`boost\`中有一個“聚合頭”,即`#include`所有庫的其他標頭檔案。例如,`Boost.Python`的聚合頭是
.    boost\python.hpp.
- 大多數庫將私有頭放在名為 `detail\` 或 `aux_\` 的子目錄中。不要指望在這些目錄中找到任何可以使用的東西。

重要的是要注意以下幾點:

  1. boost根目錄(boost root directory)(通常是C:\Program Files\boost\boost_1_69_0)有時在boost文件和郵件列表中也稱為$BOOST_ROOT
  2. 要在Boost中編譯任何內容,您需要在include目錄中包含boost\子目錄。 在Microsoft Visual Studio中設定include路徑的具體步驟將在本文件的後面部分中介紹; 如果您使用其他IDE,請參閱產品文件以獲取相關說明。
  3. 由於所有Boost標頭檔案都具有.hpp副檔名,並且位於boost根目錄下的boost\子目錄中,因此你的Boost #include指令將如下所示:
#include <boost/whatever.hpp>

#include "boost/whatever.hpp"

取決於您對使用尖括號的偏好包括。即使是Windows使用者也可以(並且出於可移植性的原因,可能)在#include指令中使用正斜槓(forward slashes); 你的編譯器不關心。

  1. 不要被doc\子目錄分散注意力; 它只包含Boost文件的子集。如果要檢視完整的檔案,從 libs\index.html 開始。

3. 僅用標頭檔案的庫 Header-Only Libraries

許多人想要知道的第一件事是,“我如何構建Boost?”好訊息是,通常沒有什麼可構建的。

什麼都沒有建立?

大多數Boost庫只是標頭檔案:它們完全由包含模板和行內函數的標頭檔案組成,並且在連結時不需要單獨編譯的庫二進位制檔案或特殊處理。

必須單獨構建的Boost庫是:

  • Boost.Chrono
  • Boost.Context
  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.Locale
  • Boost.Log (see build documentation)
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python (see the Boost.Python build documentation before building and installing it)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost.System
  • Boost.Thread
  • Boost.Timer
  • Boost.Wave

一些庫具有可選的單獨編譯的二進位制檔案:

  • Boost.DateTime有一個二進位制元件,只有在使用其to_string/from_string或序列化功能時才需要,或者如果你的目標是Visual C ++ 6.xBorland
  • Boost.Graph 有一個二進位制元件,只有在你打算解析GraphViz檔案時才需要它。
  • Boost.Math具有TR1和C99 cmath函式的二進位制元件。
  • Boost.Random有一個二進位制元件,只有在你使用random_device時才需要它。
  • Boost.Test可用於“僅標題”或“單獨編譯”模式,但建議單獨編譯以供嚴肅使用。
  • Boost.Exception為32位_MSC_VER == 1310_MSC_VER == 1400提供了exception_ptr的非侵入式實現,這需要單獨編譯的二進位制檔案。這是由#define BOOST_ENABLE_NON_INTRUSIVE_EXCEPTION_PTR啟用的。

4. 使用Boost構建一個簡單的程式 Build a Simple Program Using 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的檔案中。

注意

要構建本指南中的示例,您可以使用Visual Studio等整合開發環境(IDE),也可以從命令提示符發出命令。由於每個IDE和編譯器都有不同的選項,而微軟是迄今為止Windows上的主要編譯器,我們只為Visual Studio 2005和.NET 2003 IDE以及它們各自的命令提示符編譯器提供了具體指示(使用命令提示符稍微簡單一點)。如果您使用的是其他編譯器或IDE,則可以相對輕鬆地將這些指令調整到您的環境中。

4.1 使用Visual Studio IDE構建

命令提示符基礎知識

在Windows中,通過在命令提示符視窗中鍵入其名稱(後跟可選引數)並按Return(或Enter)鍵來呼叫命令列工具。
若要開啟通用命令提示符,請單擊`“開始”`選單按鈕,單擊`“執行”`,鍵入`“cmd”`,然後單擊`“確定”`。
所有命令都在檔案系統中`當前目錄`的上下文中執行。要設定`當前目錄`,請鍵入:
. cd /d path\to\some\directory
然後返回。例如,
. cd /d E:\dev\VS2017\boost_1_69_0
通過在除最後一行之外的所有行的末尾鍵入插入符號(^),可以在多行中繼續執行長命令。本文的一些示例使用該技術來節省水平空間。
  • 從Visual Studio 2017的“檔案”選單中,選擇“新建” > “專案”...
  • 在生成的“新建專案”對話方塊的左側窗格中,選擇“已安裝” > “Visual C++” > “Windows桌面”。
  • 在右側窗格中,選擇 Win32控制檯應用程式
  • 在名稱欄位中,輸入example_boost
  • 右鍵單擊“解決方案資源管理器”窗格中的example_boost,然後從彈出的選單中選擇“屬性”
  • 在 “配置屬性” > “C/C++” > “常規” > “其他包含目錄” 中,輸入Boost根目錄的路徑
    E:\dev\VS2017\boost_1_69_0
  • 在“配置屬性” > “C/C++” > “預編譯標題”中,將“使用預編譯標題(/Yu)”更改為“不使用預編譯標題”。
  • 使用上面的示例程式碼替換IDE生成的example.cpp的內容。
  • 從Build選單中,選擇Build Solution。

要測試您的應用程式,請按F5鍵並在結果視窗中鍵入以下內容,然後按Return鍵:

    1 2 3

然後按住控制鍵並按“Z”,然後按Return鍵。

4.2 從命令提示符構建 Or, Build From the Command Prompt

從計算機的“開始”選單中,如果您是Visual Studio 2017使用者,請選擇

.  Visual Studio 2017 > 適用於 VS 2017 的 x64 本機工具命令提示

為Visual Studio編譯器調出一個特殊的命令提示符視窗。在該視窗中,將當前目錄設定為適合建立一些臨時檔案的位置,然後鍵入以下命令,後跟Return鍵:

cl /EHsc /I E:\dev\VS2017\boost_1_69_0 D:\Users\yaoyu\source\repos\example_boost\example_boost\example_boost.cpp

要測試結果,請鍵入:

echo 1 2 3 | example_boost

4.3 錯誤和警告 Errors and Warnings

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

5 準備使用Boost Library Binary

如果要使用任何單獨編譯的Boost庫,則需要獲取庫二進位制檔案。

5.1 使用原始碼簡單構建

如果您希望使用Visual C++從原始碼構建,可以使用本節中描述的簡單構建過程。開啟命令提示符並將當前目錄更改為Boost根目錄(Boost root directory)。然後,鍵入以下命令:

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 確定工具集 Identify Your Toolset

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


注意

如果您之前為了構建b2而選擇了一個工具集,那麼您應該假設它不起作用,而是從下表中新選擇。

Toolset Name Vendor Notes
acc Hewlett Packard Only very recent versions are known to work well with Boost
borland Borland  
como Comeau Computing Using this toolset may require configuring another toolset to act as its backend.
darwin Apple Computer Apple's version of the GCC toolchain with support for Darwin and MacOS X features such as frameworks.
gcc The Gnu Project Includes support for Cygwin and MinGW compilers.
hp_cxx Hewlett Packard Targeted at the Tru64 operating system.
intel Intel  
msvc Microsoft  
sun Oracle Only very recent versions are known to work well with Boost. Note that the Oracle/Sun compiler has a large number of options which effect binary compatibility: it is vital that the libraries are built with the same options that your appliction will use. In particular be aware that the default standard library may not work well with Boost, unless you are building for C++11. The particular compiler options you need can be injected with the b2 command line options cxxflags=``and ``linkflags=. For example to build with the Apache standard library in C++03 mode use b2 cxxflags=-library=stdcxx4 linkflags=-library=stdcxx4.
vacpp IBM The VisualAge C++ compiler.

如果安裝了特定編譯器的多個版本,則可以將版本號附加到工具集名稱,後面加一個連字元,例如intel-9.0或borland-5.4.3。在Windows上,即使您只安裝了一個版本(除非您使用的是具有特殊版本檢測程式碼的msvc或gcc工具集),否則auto-linking會失敗。

5.2.3 選擇構建目錄 Select a Build Directory

Boost.Build會將構建時生成的所有中間檔案放入構建目錄(build directory)中。如果您的Boost根目錄是可寫的,則此步驟不是必需的:預設情況下,Boost.Build將在您當前的工作目錄中為此建立bin.v2/子目錄。

5.2.4 呼叫b2 Invoke b2

將當前目錄更改為Boost根目錄, 並按如下方式呼叫b2:

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

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

例如,您的會話可能如下所示:

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

請務必閱讀關於^, More?和該行中的引號(“)的說明

選項 --build-type=complete 會讓Boost.Build構建所有支援的庫版本。有關如何僅構建特定版本的說明,請在Boost.Build郵件列表中查詢。

構建特殊階段(stage)目標將Boost庫二進位制檔案放在Boost樹的stage\lib\子目錄中。要使用其他目錄,請將--stagedir=directory選項傳遞給b2。

注意
b2區分大小寫; 重要的是,上面以 粗體顯示的所有部件都是完全小寫的。

有關在呼叫b2時可以傳遞的其他選項的說明 ,請鍵入:

b2 --help

特別是,為了限制建設所花費的時間,您可能會對以下內容感興趣:

  • 使用--show-libraries檢視庫名列表
  • 使用--with-library-name--without-library-name選項選擇要構建(或不構建)的庫
  • 通過向命令列新增releasedebug來選擇特定的構建版本。
注意
Boost.Build可以產生大量的輸出,這可以很容易地錯過問題。如果要確保一切順利,可以通過在命令列中附加 `> build.log 2>&1` 將輸出重定向到檔案中。

5.3 預期的構建輸出 Expected Build Output

在構建Boost庫的過程中,您可以期望在控制檯上看到一些訊息。這些可能包括

  • 關於Boost庫配置的注意事項 - 例如,Regex庫在沒有Unicode支援的情況下生成有關ICU的訊息,如果沒有安裝Python,可以跳過Python庫而不會出現錯誤(但需要注意)。
  • 來自構建工具的訊息,用於報告已構建或跳過的目標數。如果這些數字對你沒有任何意義,不要感到驚訝; 每個庫有很多目標。
  • 構建描述工具正在做什麼的動作訊息,如下所示:
    toolset-name.c++ long/path/to/file/being/built
  • 編譯器警告。

5.4 在構建錯誤的情況下 In Case of Build Errors

在構建Boost時看到的唯一錯誤訊息(如果有的話)應該與IOStreams庫對zip和bzip2格式的支援有關。如果需要這些特性,請安裝libz和libbz2的相關開發包。構建Boost庫時的其他錯誤也值得關注。

如果它看起來像編譯系統無法找到你的編譯器和/或聯結器,考慮設定一個user-config.jam檔案。如果這不是您的問題或user-config.jam檔案不工作,請解決有關將編譯器的Boost配置到Boost.Build郵件列表的問題。

6 將您的程式連結到Boost Library

為了演示與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;
    }
}

連結有兩個主要挑戰:

  • 工具配置,例如, 選擇命令列選項或IDE構建設定。
  • 在所有構建版本中識別庫二進位制檔案,其編譯配置與專案的其餘部分相容。
自動連結
大多數Windows編譯器和連結器都具有所謂的“自動連結支援”(auto-linking support),這消除了第二個挑戰。Boost標頭檔案中的特殊程式碼檢測您的編譯器選項,並使用該資訊將正確庫的名稱編碼到目標檔案中; 連結器從您告訴它搜尋的目錄中選擇具有該名稱的庫。
GCC工具鏈(Cygwin和MinGW)是值得注意的例外; GCC使用者應參考[ linking instructions for Unix variant OSes ](https://www.boost.org/doc/libs/1_69_0/more/getting_started/unix-variants.html#link-your-program-to-a-boost-library),以獲取相應的命令列選項。

6.1 從Visual Studio IDE中連結

從我們之前建立的僅標頭檔案example專案開始:

  1. 右鍵單擊“解決方案資源管理器”窗格中的example,然後從彈出的選單中選擇“屬性”
  2. 配置屬性 > 連結器 > 附加庫目錄中,輸入Boost二進位制檔案的路徑,例如E:\dev\VS2017\boost_1_69_0\lib64-msvc-14.1
  3. 從Build選單中,選擇Build Solution。

6.2 從命令提示符連結

例如,假設您的Boost二進位制檔案位於E:\dev\VS2017\boost_1_69_0\lib64-msvc-14.1中,我們可以通過簡單地將下面的粗體文字新增到我們之前使用的命令列,從Visual C++命令列編譯和連結上述程式。:

cl /EHsc /I E:\dev\VS2017\boost_1_69_0 example_boost.cpp   ^
     /link /LIBPATH:E:\dev\VS2017\boost_1_69_0\lib64-msvc-14.1

6.3 庫命名 Library Naming

自動連結
如果像Visual C++一樣,您的編譯器支援自動連結,您可以跳到下一步。

為了配置正確的二進位制檔案,您需要知道Boost二進位制檔案是如何命名的。每個庫檔名由一組共同的元素序列組成,這些元素描述了它的構建方式。例如,libboost_regex-vc71-mt-d-x86-1_34.lib可以分解為以下元素:

lib


字首(Prefix):除Microsoft Windows外,每個Boost庫名稱都以此字串開頭。在Windows上,只有普通的靜態庫(ordinary static libraries)使用lib字首; 匯入庫和DLL沒有。

boost_regex


庫名(Library name):所有boost庫檔名都以boost_開頭。

-vc71


工具集標記(Toolset tag):標識用於構建二進位制檔案的工具集和版本。

-mt


執行緒標記(Threading tag):表示庫是在啟用多執行緒(multithreading)支援的情況下構建的。沒有多執行緒支援而構建的庫可以通過去掉 -mt 來識別。

-d


ABI標記:對影響庫與其他編譯程式碼的互操作性的細節進行編碼。對於每個此類功能,標記中都會新增一個字母:

Key Use this library when: Boost.Build option
s linking statically to the C++ standard library and compiler runtime support libraries. runtime-link=static
g using debug versions of the standard and runtime support libraries. runtime-debugging=on
y using a special debug build of Python. python-debugging=on
d building a debug version of your code.6 variant=debug
p using the STLPort standard library rather than the default one supplied with your compiler. stdlib=stlport

例如,如果構建程式碼的除錯版本以用於靜態執行時庫和STLPort標準庫的除錯版本,則標記將為:-sgdp。如果以上都不適用,則省略ABI標記。

-x86


體系結構和地址模式標記(Architecture and address model tag):在第一個字母中,對體系結構進行如下編碼:

Key Architecture Boost.Build option
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

字母后面的兩位數字對地址模型進行編碼,如下所示:

Key Address model Boost.Build option
32 32 bit address-model=32
64 64 bit address-model=64

-1_34


版本標籤(Version tag):完整的Boost版本號,點號由下劃線替換。例如,版本1.31.1將標記為“-1_31_1”。

.lib


副檔名(Extension):根據作業系統的慣例確定。在大多數unix風格的平臺上,副檔名分別為 .a 和 .so,分別用於靜態庫(歸檔)和共享庫。在Windows上,.dll表示共享庫,.lib表示靜態庫或匯入庫。在unix變體上的工具集支援的情況下,新增完整版本擴充套件(例如“.so.1.34”),並且還將建立指向沒有尾隨版本號的庫檔案的符號連結。

6.4 測試 Test Your Program

為了測試我們的主題提取,我們將過濾以下文字檔案。將其從瀏覽器中複製並儲存為jayne.txt

To: George Shmidlap
From: Rita Marlowe
Subject: Will Success Spoil Rock Hunter?
---
See subject.

現在,在命令提示符視窗中,鍵入:

path\to\compiled\example < path\to\jayne.txt
D:\Users\yaoyu\source\repos\example_boost\example_boost>example_boost.exe < jayne.txt

程式應輸出電子郵件主題, “Will Success Spoil Rock Hunter?”

7 結論和進一步的資源 Conclusion and Further Resources

最後介紹了Boost並將其與您的程式整合。當你開始認真地使用Boost時,肯定會有一些你希望我們覆蓋的額外點。有一天,我們可能會在“入門系列”中找到“第2冊”來解決這些問題。在此之前,我們建議您繼續使用以下資源。如果您無法找到所需內容,或者我們可以採取任何措施使此文件更加清晰,請將其釋出到Boost使用者的郵件列表中。

向前 Onward

祝好運並玩得開心點! Good luck, and have fun!

— the Boost Developers