Boost(1.69.0) windows入門(譯)

縮進2字符

Boost windows入門

基於版本1.69.0html

1. 得到Boost源代碼

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

2. Boost源代碼組織 The Boost Distribution

這是Boost目錄結構草圖:ios

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_\` 的子目錄中。不要期望在這些目錄中找到任何可使用的東西。

重要的是要注意如下幾點:c++

  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>

shell

#include "boost/whatever.hpp"

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

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

3. 僅用頭文件的庫 Header-Only Libraries

許多人想要知道的第一件事是,「我如何構建Boost?」好消息是,一般沒有什麼可構建的。windows

什麼都沒有創建?

大多數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

相關文章
相關標籤/搜索