1. 程式人生 > 實用技巧 >vs2019 boost 入坑指南

vs2019 boost 入坑指南

VS2019下安裝boost C++庫

Boost C++庫的下載安裝

  1. 官方網站:https://www.boost.org/

    選擇合適的版本下載,這裡下載了boost_1_73_0.7z

  2. 解壓即為你的安裝目錄

  3. 解壓完後,你會看到你的目錄下有bootstrap.bat批處理檔案,雙擊執行

  4. 執行完成後會在目錄下得到b2.exe檔案,可以產生lib檔案,執行會比較長久

  5. 執行完成後,在stage/lib/目錄下會產生很多lib檔案

  6. 完畢

VS的配置

分別點選

除錯->除錯屬性->VC++目錄

你可以在右框中找到包含目錄庫目錄兩項,分別新增to_your_boost_path/

to_your_boost_path/stage/lib這兩個目錄即可。

vs2019無法開啟檔案“libboost_*-vc14*-mt-gd-*.lib”

boost使用需要先編譯,然後來呼叫這個lib庫。所以才會出現下面的這種報錯。

錯誤 LNK1104 無法開啟檔案“libboost_thread-vc141-mt-gd-x64-1_69.lib”

下面是結局的步驟。先說一下報錯的原因,這個檔名是libboost_thread-vc141-mt-gd-1_69.lib,

第一個表示的是vc141表示使用的是vc141進行編輯的,也就是vc2017,如果是vs2015就應該出來vc140;

第二個mt表示的是使用threading=muti多執行緒編譯出來的。

第三個gd表示的是debug版本,與其對應的是release版本。

第四個x64表示的是64位系統,如果是x86表示的就是32位系統,還有1_69表示的就是boost版本是1_69_0.,如果是1_70表示的就是boost1_70_0。所以這個地方注意兩點,1就是你下載的boost版本要對應,2就是使用vs編譯的版本要對應。

1.首先需要下載boost,我這裡下載的是boost1.69boost官網

2.解壓boost,解壓之後的圖為

3.使用開發人員命令提示,右鍵使用管理員身份開啟,

開啟之後可以看到如下圖,然後定位到boost_1.69_0的目錄下

然後執行裡面的bootstrap.bat檔案。

然後使用下列語句進行編譯

bjam stage --toolset=msvc-14.1--without-python --stagedir="c:\Boost" link=static runtime-link=shared runtime-link=static threading=multi debug release

然後就是等待漫長的編譯過程,在這個過程中,我們可以先看一下編譯出來的東西是不是跟我們預期的一樣的。

可以看到寫的路徑c:\boost裡面已經有了一個lib資料夾,這裡面就是我們所需要的lib

等了不到兩分鐘,就可以看到裡面已經有了我想要的,因此大功告成。

喜歡的或者有問題的可以點個贊,或者下面評論。

關於這條語句的說明,突然給這條語句我很懵,而且都不知道是幹啥的,而且最開始看到的部落格只給出了一條語句,但是沒有說到底是為啥用這個語句,下面是這條語句的詳細說明

1)stage/install:

stage表示只生成庫(dll和lib),install還會生成包含標頭檔案的include目錄。本人推薦使用stage,因為install生成的這個include目錄實際就是boost安裝包解壓縮後的boost目錄(D:\boost\boost_1_70_0,只比include目錄多幾個非hpp檔案,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套標頭檔案,這樣既節省編譯時間,也節省硬碟空間。

(2)toolset:

指定編譯器,可選的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等,VS2019對應msvc-版本我查不到,就是用了14。

下面是vs對應的msvc的版本

  1. MSVC++14.0_MSC_VER== 1900 (Visual Studio 2015)

  2. MSVC++12.0_MSC_VER== 1800 (Visual Studio 2013)

  3. MSVC++ 11.0_MSC_VER== 1700 (Visual Studio 2012)

  4. MSVC++ 10.0_MSC_VER== 1600 (Visual Studio 2010)

  5. MSVC++ 9.0_MSC_VER== 1500 (Visual Studio 2008)

  6. MSVC++ 8.0_MSC_VER== 1400 (Visual Studio 2005)

  7. MSVC++ 7.1 _MSC_VER== 1310 (Visual Studio 2003)

  8. MSVC++ 7.0_MSC_VER== 1300

  9. MSVC++ 6.0_MSC_VER== 1200

  10. MSVC++ 5.0_MSC_VER== 1100

(3)without/with:

選擇不編譯/編譯哪些庫。因為python、mpi等庫我都用不著,所以排除之。還有wave、graph、math、regex、test、program_options、serialization、signals這幾個庫編出的靜態lib都非常大,所以不需要的也可以without掉。這可以根據各人需要進行選擇,預設是全部編譯。但是需要注意,如果選擇編譯python的話,是需要python語言支援的,應該到python官方主頁http://www.python.org/下載安裝。

檢視boost包含庫的命令是bjam --show-libraries。

(4)stagedir/prefix:

stage時使用stagedir,install時使用prefix,表示編譯生成檔案的路徑。我這裡直接儲存到了“D\boost“目錄下了。

(5)build-dir:

編譯生成的中間檔案的路徑。這個本人這裡沒用到,預設就在根目錄(E:\SDK\boost)下,目錄名為bin.v2,等編譯完成後可將這個目錄全部刪除(沒用了),所以不需要去設定。

(6)link:

生成動態連結庫/靜態連結庫。生成動態連結庫需使用shared方式,生成靜態連結庫需使用static方式。一般boost庫可能都是以static方式編譯,因為最終釋出程式帶著boost的dll感覺會比較累贅。

(7)runtime-link:

動態/靜態連結C/C++執行時庫。同樣有shared和static兩種方式,這樣runtime-link和link一共可以產生4種組合方式,各人可以根據自己的需要選擇編譯。

(8)threading:

單/多執行緒編譯。一般都寫多執行緒程式,當然要指定multi方式了;如果需要編寫單執行緒程式,那麼還需要編譯單執行緒庫,可以使用single方式。

(9)debug/release:

編譯debug/release版本。一般都是程式的debug版本對應庫的debug版本,所以兩個都編譯。

編譯完成之後就可以看到,在d盤的boost下就會有兩個資料夾:

然後lib下面就是我們所需要的libboost_threadXXX的檔案。

vs2019+win10配置boost庫的詳細教程

boost介紹

boost是一個準標準庫,相當於STL的延續和擴充,它的設計理念和STL比較接近,都是利用泛型讓複用達到最大化。不過對比STL,boost更加實用。 STL集中在演算法部分,而boost包含了不少工具類,可以完成比較具體的工作。

Boost庫是為C++語言標準庫提供擴充套件的一些C++程式庫的總稱。Boost庫由Boost社群組織開發、維護。其目的是為C++程式設計師提供免費、同行審查的、可移植的程式庫。Boost庫可以與C++標準庫完美共同工作,並且為其提供擴充套件功能。Boost庫使用Boost License來授權使用,根據該協議,商業的非商業的使用都是允許並鼓勵的。

Boost社群建立的初衷之一就是為C++的標準化工作提供可供參考的實現,Boost社群的發起人Dawes本人就是C++標準委員會的成員之一。在Boost庫的開發中,Boost社群也在這個方向上取得了豐碩的成果。在送審的C++標準庫TR1中,有十個Boost庫成為標準庫的候選方案。在更新的TR2中,有更多的Boost庫被加入到其中。從某種意義上來講,Boost庫成為具有實踐意義的準標準庫。

大部分boost庫功能的使用只需包括相應標頭檔案即可,少數(如正則表示式庫,檔案系統庫等)需要連結庫。裡面有許多具有工業強度的庫,如graph庫。

很多Boost中的庫功能堪稱對語言功能的擴充套件,其構造用盡精巧的手法,不要貿然的花費時間研讀。Boost另外一面,比如Graph這樣的庫則是具有工業強度,結構良好,非常值得研讀的精品程式碼,並且也可以放心的在產品程式碼中多多利用。

boost主要包含一下幾個大類:字串及文字處理、容器、迭代子(Iterator)、演算法、函式物件和高階程式設計、泛型程式設計、模板超程式設計、預處理超程式設計、併發程式設計、數學相關、糾錯和測試、資料結構、輸入/輸出、跨語言支援、記憶體相關、語法分析、雜項。 有一些庫是跨類別包含的,就是既屬於這個類別又屬於那個類別。

boost庫:

Boost庫是為C++語言標準庫提供擴充套件的一些C++程式庫的總稱,由Boost社群組織開發、維護。Boost庫可以與C++標準庫完美共同工作,並且為其提供擴充套件功能。

一.下載boost庫

直接去官網下載http://www.boost.org

中間位置有download點選。選擇要下載的安裝包。這裡我用的是windows,選擇的是boost_1_73_0.zip。linux可以選擇字尾為tar.gz和其他的。

二.編譯

下載好後,解壓,得到檔案目錄如下圖,找到其中的bootstrap.bat檔案:

然後開啟vs2019的命令列:這裡選擇64位或者32位的都可以。我選擇的是x86_x64的。

然後切換到你解壓到的路徑。執行bootstrap.bat。

1 2 cd D:\aboost\boost_1_73_0 bootstrap.bat //執行

執行之後,檢視boost_1_73_0下會多出幾個檔案。b2。執行b2.

這裡執行的時間有點長,等待就行,最後執行成功之後會顯示。

在使用boost庫包含上面的資料夾與連結庫。

三.測試boost

1.開啟VS2019,新建一個空C++專案,並建立main.cpp 檔案。點選專案的屬性。

2.在vc++目錄中包含目錄新增boost路徑D:\aboost\boost_1_73_0,庫目錄新增D:\aboost\boost_1_73_0\stage\lib。儲存即可。

3.測試(以多執行緒並行排序為例)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> #include <boost/sort/sort.hpp> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> arr; while (arr.size() < 100) arr.push_back(std::rand()); boost::sort::block_indirect_sort(std::begin(arr), std::end(arr)); for_each(std::begin(arr), std::end(arr), [](int& a) { cout << a << "\t"; }); return 0; }

這裡執行注意要選擇,你之前命令列選擇的版本,要不然boost不會包含在內,會出錯。

VS2019配置BOOST的方法(v1.70.0庫)

安裝編譯Boost c++ library

安裝Boost庫

官網下載:https://www.boost.org/users/history/version_1_70_0.html

最新版本1.70.0. (低於1.7.0的版本可能在vs2019中支援不完善,編譯或執行時發生不可預料的bug)

下載好後,解壓,得到檔案目錄如下圖,找到其中的bootstrap.bat檔案:

雙擊執行可能出現閃退,最好的辦法(親測有效): 選擇vs2019 —> visual studio tools —> vc —> x86_x64 Cross Tools Command Prompt for VS 2,開啟命令列:

切換到boost_1_70_0的安裝目錄,(本人安裝路徑:E:\program\boost_1_70_0)

1 2 cd E:\program\boost_1_70_0 bootstrap.bat # 執行

執行會發現當前資料夾中增加了幾個檔案,找到其中的bjam.exe,如下圖所示

命令列執行:

bjam.exe --toolset=msvc-14.1 architecture=x86 address-model=64 link=static --build-type=complete --with-system --with-thread --with-date_time --with-filesystem --with-serialization

Note:

MSVC 版本號對應

1.MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
2.MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
3.MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
4.MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
5.MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008)
6.MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005)
7.MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio 2003)
8.MSVC++ 7.0 _MSC_VER == 1300
9.MSVC++ 6.0 _MSC_VER == 1200
10.MSVC++ 5.0 _MSC_VER == 1100

vs2019 可以支援boost c++ library 針對msvc-14.1的編譯選項

等待5-10min即可完成。

最後兩個路徑會在使用Boost庫時工程屬性中包含目錄和庫目錄中用到。

The Boost C++ Libraries were successfully built.
the following directory should be added to compiler include paths:
E:\program\boost_1_70_0
the following directory should be added to linker library paths:
E:\program\boost_1_70_0\stage\lib

這時boost庫已經安裝、編譯成功。

新建vs2019 c++專案,並新增boost依賴庫

點選選單欄 專案——>屬性——>選擇VC++目錄,在包含目錄 和 庫目錄新增以上2個路徑,如下圖:

或可以新建一個系統環境變數BOOST_DIR,值為E:\program\boost_1_70_0。

在path系統環境變數中新增:%BOOST_DIR%;

VC++包含目錄中新增: %BOOST_DIR%;

VC++庫目錄中新增: %BOOST_DIR%\stage\lib;

程式碼測試

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <boost/lexical_cast.hpp> #include <iostream> using namespace std; using namespace boost; int main() { //system("chcp 65001"); double a = lexical_cast<double>("3.1415926"); string str = lexical_cast<string>("3.1415926"); cout << "This is a number: " << a << endl; cout << "This is a string: " << str << endl; int b = 0; try { b = lexical_cast<int>("neo"); } catch (bad_lexical_cast& e) { cout << e.what() << endl; } return 0; }

執行輸出(正常):

This is a number: 3.14159
This is a string: 3.1415926
bad lexical cast: source type value could not be interpreted as target

c++ boost庫說明

c++ boost庫官網

官網最新版文件說明:https://www.boost.org/doc/libs/1_70_0/

refer: 百度百科

Boost庫是一個可移植、提供原始碼的C++庫,作為標準庫的後備,是C++標準化程序的開發引擎之一,是為C++語言標準庫提供擴充套件的一些C++程式庫的總稱。 Boost庫由C++標準委員會庫工作組成員發起,其中有些內容有望成為下一代C++標準庫內容。在C++社群中影響甚大,是不折不扣的“準”標準庫。Boost由於其對跨平臺的強調,對標準C++的強調,與編寫平臺無關。大部分boost庫功能的使用只需包括相應標頭檔案即可,少數(如正則表示式庫,檔案系統庫等)需要連結庫。但Boost中也有很多是實驗性質的東西,在實際的開發中使用需要謹慎。

Boost庫由Boost社群組織開發、維護。其目的是為C++程式設計師提供免費、同行審查的、可移植的程式庫。Boost庫可以與C++標準庫完美共同工作,並且為其提供擴充套件功能。Boost庫使用Boost License來授權使用。

Boost社群建立的初衷之一就是為C++的標準化工作提供可供參考的實現,Boost社群的發起人Dawes本人就是C++標準委員會的成員之一。在Boost庫的開發中,Boost社群也在這個方向上取得了豐碩的成果。在送審的C++標準庫TR1中,有十個Boost庫成為標準庫的候選方案。在更新的TR2中,有更多的Boost庫被加入到其中。從某種意義上來講,Boost庫成為具有實踐意義的準標準庫。
可下載Boost C++ Libraries安裝boost庫。大部分boost庫功能的使用只需包括相應標頭檔案即可,少數(如正則表示式庫,檔案系統庫等)需要連結庫。裡面有許多具有工業強度的庫,如graph庫。

主要分類

按照功能分類的Boost庫列表
按照實現的功能,Boost 可為大致歸入以下20個分類,在下面的分類中,有些庫同時歸入幾種類別。
字串和文字處理
a) Conversion
b) Format
c) IOStream
d) Lexical Cast
e) Regex
f) Spirit
g) String Algo
h) Tokenizer
i) Wave
j) Xpressive

容器
a) Array
b) Bimap
c) Circular Buffer
d) Disjoint Sets
e) Dynamic Bitset
f) GIL
g) Graph
h) ICL
i) Intrusive
j) Multi-Array
k) Multi-Index
l) Pointer Container
m) Property Map
n) Property Tree
o) Unordered
p) Variant

迭代器
a) GIL
b) Graph
c) Iterators
d) Operators
e) Tokenizer

演算法
a) Foreach
b) GIL
c) Graph
d) Min-Max
e) Range
f) String Algo
g) Utility

函式物件和高階程式設計
a) Bind
b) Function
c) Functional
d) Functional/Factory
e) Functional/Forward
f) Functional/Hash
g) Lambda
h) Member Function
i) Ref
j) Result Of
k) Signals
l) Signals2
m) Utility

泛型程式設計
a) Call Traits
b) Concept Check
c) Enable If
d) Function Types
e) GIL
f) In Place Factory, Typed In Place Factory
g) Operators
h) Property Map
i) Static Assert
j) Type Traits

模板超程式設計

a) Function Types
b) Fusion
c) MPL
d) Proto
e) Static Assert
f) Type Traits

預處理超程式設計
a) Preprocessors

併發程式設計

a) Asio
b) Interprocess
c) MPI
d) Thread

數學和數字

a) Accumulators
b) Integer
c) Interval
d) Math
e) Math Common Factor
f) Math Octonion
g) Math Quaternion
h) Math/Special Functions
i) Math/Statistical Distributions
j) Multi-Array
k) Numeric Conversion
l) Operators
m) Random
n) Rational
o) uBLAS

排錯和測試

a) Concept Check
b) Static Assert
c) Test

資料結構

a) Any
b) Bitmap
c) Compressed Pair
d) Fusion
e) ICL
f) Multi-Index
g) Pointer Container
h) Property Tree
i) Tuple
j) Uuid
k) Variant

影象處理

a) GIL

輸入輸出

a) Asio
b) Assign
c) Format
d) IO State Savers
e) IOStreams
f) Program Options
g) Serialization

跨語言混合程式設計

a) Python

記憶體管理

a) Pool
b) Smart Ptr
c) Utility

解析
a) Spirit

程式設計介面
a) Function
b) Parameter

雜項
a) Compressed Pair
b) Conversion
c) CRC
d) Date Time
e) Exception
f) Filesystem
g) Flyweight
h) Lexical Cast
i) Meta State Machine
j) Numeric Conversion
k) Optional
l) Polygon
m) Program Options
n) Scope Exit
o) Statechart
p) Swap
q) System
r) Timer
s) Tribool
t) Typeof
u) Units
v) Utility
w) Value Initialized

編譯器問題的變通方案

a) Compatibility
b) Config

常用庫

  • Regex
  • 正則表示式庫
  • Spirit
  • LL parser framework,用C++程式碼直接表達EBNF
  • Graph
  • 圖元件和演算法
  • Lambda
  • 在呼叫的地方定義短小匿名的函式物件,很實用的functional功能
  • concept check
  • 檢查泛型程式設計中的concept
  • Mpl
  • 用模板實現的超程式設計框架
  • Thread
  • 可移植的C++多執行緒庫
  • Python
  • 把C++類和函式對映到Python之中
  • Pool
  • 記憶體池管理
  • smart_ptr
  • 5個智慧指標,學習智慧指標必讀,一份不錯的參考是來自CUJ的文章:

相關圖書編輯

    • Boost程式庫完全開發指南:深入C++“準”標準庫
    • C++11/14高階程式設計:Boost程式庫探祕(第3版)
    • Boost程式庫探祕:深度解析C++準標準庫

boost 1.*.* 編譯及使用

boost的編譯和使用,經過蒐集資料和總結,記錄成文。感謝文後所列參考資料的作者。

1 下載

地址:http://sourceforge.net/projects/boost/files/boost/1.56.0/

可以選擇boost_1_56_0.7z下載。

2 編譯

2.1 生成boost的自用的編譯工具bjam.exe

解壓後,使用VS2013編譯。首先開啟“VS2013 開發人員命令提示”,cd 到boost解壓後的根目錄:E:\XXX\boost_1_56_0,執行bootstrap.bat。會在boost根目錄生成b2.exe 、bjam.exe 、project-config.jam 、bootstrap.log四個檔案。

其中,b2.exe 、bjam.exe這兩個exe作用是一樣的,bjam.exe 是老版本,b2是bjam的升級版本。

2.2 使用bjam(或b2)來編譯boost

1. bjam命令引數分析

我們以文章【1】中的命令來分析一下各個引數的作用(原作者解壓後的boost根目錄為E:\SDK\boost)。

bjam stage --toolset=msvc-9.0 --without-python --stagedir="E:\SDK\boost\bin\vc9" link=static runtime-link=shared runtime-link=static threading=multi debug release

(1)stage/install:

stage表示只生成庫(dll和lib),install還會生成包含標頭檔案的include目錄。本人推薦使用stage,因為install生成的這個include目錄實際就是boost安裝包解壓縮後的boost目錄(E:\SDK\boost\boost,只比include目錄多幾個非hpp檔案,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套標頭檔案,這樣既節省編譯時間,也節省硬碟空間。

(2)toolset:

指定編譯器,可選的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。

(3)without/with:

選擇不編譯/編譯哪些庫。因為python、mpi等庫我都用不著,所以排除之。還有wave、graph、math、regex、test、program_options、serialization、signals這幾個庫編出的靜態lib都非常大,所以不需要的也可以without掉。這可以根據各人需要進行選擇,預設是全部編譯。但是需要注意,如果選擇編譯python的話,是需要python語言支援的,應該到python官方主頁http://www.python.org/下載安裝。

檢視boost包含庫的命令是bjam --show-libraries

(4)stagedir/prefix:

stage時使用stagedir,install時使用prefix,表示編譯生成檔案的路徑。推薦給不同的IDE指定不同的目錄,如VS2008對應的是E:\SDK\boost\bin\vc9,VC6對應的是E:\SDK\boost\bin\vc6,否則都生成到一個目錄下面,難以管理。如果使用了install引數,那麼還將生成標頭檔案目錄,vc9對應的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6類似(光這路徑都這樣累贅,還是使用stage好)。

(5)build-dir:

編譯生成的中間檔案的路徑。這個本人這裡沒用到,預設就在根目錄(E:\SDK\boost)下,目錄名為bin.v2,等編譯完成後可將這個目錄全部刪除(沒用了),所以不需要去設定。

(6)link:

生成動態連結庫/靜態連結庫。生成動態連結庫需使用shared方式,生成靜態連結庫需使用static方式。一般boost庫可能都是以static方式編譯,因為最終釋出程式帶著boost的dll感覺會比較累贅。

(7)runtime-link:

動態/靜態連結C/C++執行時庫。同樣有shared和static兩種方式,這樣runtime-link和link一共可以產生4種組合方式,各人可以根據自己的需要選擇編譯。

(8)threading:

單/多執行緒編譯。一般都寫多執行緒程式,當然要指定multi方式了;如果需要編寫單執行緒程式,那麼還需要編譯單執行緒庫,可以使用single方式。

(9)debug/release:

編譯debug/release版本。一般都是程式的debug版本對應庫的debug版本,所以兩個都編譯。

2.編譯boost

編譯boost的命令比較複雜,尤其是link, runtime-link 這兩個選項的功能分不太清楚,他們共有4種相互組合,這些相互組合各有什麼含義呢?

所以首先做個實驗,僅編譯date_time庫,觀察一下這兩個選項的作用。

分別使用下面的命令列編譯,

b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:\eCode\boost_1_56_0\bin\vc12" link=static runtime-link=static threading=multi debug release
b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:\eCode\boost_1_56_0\bin\vc12" link=static runtime-link=shared threading=multi debug release
b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:\eCode\boost_1_56_0\bin\vc12" link=shared runtime-link=shared threading=multi debug release
b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:\eCode\boost_1_56_0\bin\vc12" link=shared runtime-link=static threading=multi debug release
b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:\eCode\boost_1_56_0\bin\vc12_2" (為避免將前面的結果覆蓋,配置另一目錄vc12_2存放)
b2 stage --toolset=msvc-12.0 --with-date_time --stagedir="E:\eCode\boost_1_56_0\bin\vc12_2" --build-type=complete(為避免將前面的結果覆蓋,配置另一目錄vc12_3存放)



所得到的結果如下表所示:

序號 link runtime-link 生成物 備註
1 static static

libboost_date_time-vc120-mt-sgd-1_56.lib

libboost_date_time-vc120-mt-s-1_56.lib

2 static shared

libboost_date_time-vc120-mt-gd-1_56.lib

libboost_date_time-vc120-mt-1_56.lib

與5結果相同
3 shared shared

boost_date_time-vc120-mt-gd-1_56.dll

boost_date_time-vc120-mt-gd-1_56.lib

boost_date_time-vc120-mt-1_56.dll

boost_date_time-vc120-mt-1_56.lib

4 shared static 報錯,無法編譯
5 使用預設 使用預設

libboost_date_time-vc120-mt-gd-1_56.lib

libboost_date_time-vc120-mt-1_56.lib

與2結果相同

並且在省略debug release時,debug release版本都編譯

6 使用--build-type=complete

boost_date_time-vc120-mt-gd-1_56.dll

boost_date_time-vc120-mt-gd-1_56.lib

boost_date_time-vc120-mt-1_56.dll

boost_date_time-vc120-mt-1_56.lib

libboost_date_time-vc120-mt-sgd-1_56.lib

libboost_date_time-vc120-mt-s-1_56.lib

libboost_date_time-vc120-mt-gd-1_56.lib

libboost_date_time-vc120-mt-1_56.lib

libboost_date_time-vc120-s-1_56.lib

libboost_date_time-vc120-sgd-1_56.lib

--build-type=complete時,可以看到link,runtime-link的

3種組合下debug, release的多執行緒版本都生成出來了,

除此之外,還生成了link=static,runtime-link=static的debug, release的單執行緒版本

從上面的結果可以看到,link和runtime-link的預設配置是link=static runtime-link=shared,所以我們可以使用 (b2 stage --toolset=msvc-12.0--with-date_time--stagedir="E:\eCode\boost_1_56_0\bin\vc12_2")命令列來編譯boost。

另外,我們還可以分析一下 boost 庫的命名特點:【2】

(1)以“lib”開頭的是“link=static”版本(靜態連結庫版本,沒有dll),而直接以“boost”開頭的是“link=shared”版本(動態連結庫版本,包含lib和dll)。

(2)所有的庫都含有"boost"字首。

(3)緊隨其後的是boost庫名稱(比如date_time庫)。

(4)然後是編譯器的版本,與庫名稱之間以"-"而不是下劃線"_"分隔(比如 -vc120)。

(5)有“mt”的為“threading=multi”版本,沒有的則是“threading=single”版本。

(6)有“s”的為“runtime-link=static”版本,沒有的則是“runtime-link=shared”版本。

(7)有“gd”的為debug版本,沒有的則是release版本。

(8)所有的庫都含有boost庫的版本號結尾(比如1_56,其中的"."以下劃線"_"代替)

3.link, runtime-link 組合分析

文章【2】給出了link,runtime-link的具體作用分析。

假設一個庫A依賴於庫B,我們自己的程式client依賴於庫A,即:

那麼,link指的是client->A,runtime-link指的是A -> B

配置

連結過程

執行時需要的檔案

link=static

runtime-link=static

client通過A.a (A.lib)靜態包含A;

A通過B.a (B.lib)靜態包含B;

不關.so .dll的事

client

link=static

runtime-link=shared

client通過A.a (A.lib)靜態包含A;

在執行時,client要動態呼叫B.so (B.dll)

client

B.so (B.dll)

link=shared

runtime-link=shared

client會包含A.a (A.lib);

A會包含B.a (B.lib);

但都只儲存動態庫的真正實現的stub,執行時通過stub去動態載入A.so (A.dll), B.so (B.dll)中的實現

client

A.so (A.dll)

B.so (B.dll)

link=shared

runtime-link=static

client會包含A.a (A.lib),但只包含真正實現的stub;

A通過B.a (B.lib)靜態包含B;

執行時,client會動態呼叫A.so (A.dll)

client

A.so (A.dll)

3. 配置

包含標頭檔案的Include路徑:E:\eCode\boost_1_56_0

包含庫檔案的連結路徑:E:\eCode\boost_1_56_0\bin\vc12\lib

(1)可以設定為僅用於當前project:

選中當前project->Properties->Configuration Properties->C/C++->General: Additional Include Directories: 設定E:\eCode\boost_1_56_0

選中當前project->Properties->Configuration Properties->Linker->General: Additional LibraryDirectories: 設定E:\eCode\boost_1_56_0\bin\vc12\lib

(2)可設定為僅用於當前Solution:

選中當前project->Properties->Configuration Properties->VC++ Directories:

Include Directories:設定E:\eCode\boost_1_56_0

LibraryDirectories: 設定E:\eCode\boost_1_56_0\bin\vc12\lib

(3)可設定為OS當前使用者下的VC++環境(當前使用者下VC++所建立的所有Solution)

在某個已開啟的工程下,切換到Property Manager 選項卡,然後然後展開當前工程的properties配置,開啟Microsoft.Cpp.Win32.User

選擇Common Properties->VC++ Directories:

Include Directories:設定E:\eCode\boost_1_56_0

LibraryDirectories: 設定E:\eCode\boost_1_56_0\bin\vc12\lib

這樣設定的僅在Win32編譯選項下起作用,x64編譯選項需要另外配置x64的properties sheet。

(4)可設定為OS所有使用者下的VC++環境

可以編輯Microsoft.Cpp.Default.props 、Microsoft.Cpp.props 。這裡就不介紹了。

4. 測試

使用文章【3】中date_time計時函式。建立一個Win32 console 工程,然後copy下面程式碼

//#define BOOST_DATE_TIME_SOURCE
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
using namespace boost::gregorian;
using namespace boost::posix_time;

/************************************************************************
建立微秒級的計時器
************************************************************************/

template <class T = microsec_clock>
class MyTimer
{
private:
    ptime m_startTime;

public:
    MyTimer()
    {
        Restart();
    }

    void Restart()
    {
        m_startTime = T::local_time();
    }


    void Elapsed()
    {
        cout << T::local_time() - m_startTime << endl;
    }
};


int main()
{
    MyTimer<microsec_clock> t;
    for(int i = 0; i < 100; ++i)
    {
        cout << "hello" << endl;
    }
    t.Elapsed();
}

注意開頭的巨集 “#define BOOST_DATE_TIME_SOURCE” 注掉了。若啟用這個巨集定義,則預設由編譯器重新編譯嵌入的標頭檔案;若不啟用這個巨集定義,則表示使用系統已編譯好的date_time庫。

(1)禁用#define BOOST_DATE_TIME_SOURCE 巨集,然後將libboost_date_time-vc120-mt-gd-1_56.lib 從E:\eCode\boost_1_56_0\bin\vc12\lib 中移除,編譯debug版的程式時,提示連線錯誤,缺少libboost_date_time-vc120-mt-gd-1_56.lib。

(2)啟用#define BOOST_DATE_TIME_SOURCE 巨集,編譯debug版的程式時,可發現即使在缺少libboost_date_time-vc120-mt-gd-1_56.lib的情況下,也能成功編譯。

References

【1】Boost下載安裝編譯配置使用指南(含Windows、Linux以及ARM Linux)(http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html

【2】link 和 runtime-link,搭配shared 和 static(http://blog.csdn.net/yasi_xi/article/details/8660549

【3】計時函式(二)(http://www.cnblogs.com/jerry19880126/archive/2013/02/20/2919718.html

【4】官方文件Getting Started on Windows(http://www.boost.org/doc/libs/1_56_0/more/getting_started/windows.html)

【5】bjam使用(http://blog.chinaunix.net/uid-22301538-id-3158997.html