1. https://www.boost.org 下載boost源碼 boost_1_73_0.zip解壓。
2.准備編譯前的配置,打開vs2017 x86 CMD工具,進入目錄boost_1_73_0\,執行bootstrap.bat,等待初始化完畢,
會生成b2.exe和bjam.exe兩個程序,所有編譯工作都是通過b2.exe或bjam.exe完成,可以通過help查看參數,b2.exe方式比較新。
指令格式大概如下:
b2 install --toolset=msvc-14.1 --prefix="D:\Boost\vc141" link=static runtime-link=shared threading=multi debug release
(1)stage/install:
stage表示只生成庫(dll和lib),install還會生成包含頭文件的include目錄和CMake文件夾。
(2)toolset:
指定編譯器,可選的如minGW、msvc等。
vs2017 : msvc-14.1,vs2015 : msvc-14.0,
(3)without/with:
選擇不編譯/編譯哪些庫。因為python、mpi等庫我都用不着,所以排除之。還有wave、graph、math、regex、test、program_options、serialization、signals這幾個庫編出的靜態lib都非常大,所以不需要的也可以without掉。這可以根據各人需要進行選擇,默認是全部編譯。但是需要注意,如果選擇編譯python的話,是需要python語言支持的,應該到python官方主頁http://www.python.org/下載安裝。
查看boost包含庫的命令是b2 --show-libraries。
4)stagedir/prefix:
stage時使用stagedir,install時使用prefix,表示編譯生成文件的路徑。推薦給不同的IDE指定不同的目錄,32位、64位要區分開,不過IDE也有區分。
(5)build-dir:
編譯生成的中間文件的路徑。這個本人這里沒用到,默認就在根目錄下,目錄名為bin.v2,等編譯完成后可將這個目錄全部刪除(沒用了),所以不需要去設置。
(6)link:
生成動態鏈接庫/靜態鏈接庫。生成動態鏈接庫需使用shared方式,生成靜態鏈接庫需使用static方式。一般boost庫可能都是以static方式編譯,因為最終發布程序帶着boost的dll感覺會比較累贅。
(7)runtime-link:
動態/靜態鏈接C/C++運行時庫。同樣有shared和static兩種方式,這樣runtime-link和link一共可以產生4種組合方式,各人可以根據自己的需要選擇編譯。
(8)architecture
表示架構,也就是你的CPU架構,所以是x86
(9)address-model
地址長度,32表示編譯32位的庫文件,64表示編譯64位的庫文件
(8)threading:
單/多線程編譯。一般都寫多線程程序,當然要指定multi方式了;如果需要編寫單線程程序,那么還需要編譯單線程庫,可以使用single方式。
(9)debug/release:
編譯debug/release版本。一般都是程序的debug版本對應庫的debug版本,所以兩個都編譯。
編譯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存放)
說明:
(1)--build-type=complete時link,runtime-link3種組合下debug, release的多線程版本都生成出來了除此之外還生成了link=static,runtime-link=static的debug, release的單線程版本
(2)Boost庫的使用方式link決定了生成的庫的格式:lib(靜態鏈接庫-static), dll(動態鏈接庫-share)
當link是static時,生成的靜態庫: libboost_*****.lib
當link是share時,生成的動態鏈接庫:boost_****.dll
(3)Boost庫的編譯中runtime-link,決定了生成庫與C/C++庫的連接方式
當runtime-link是static使: 生成的庫文件名有 s
當runtime-link是share使: 生成的庫文件名沒有s
(4)link以及與runtime-link缺省的設置是:
link是靜態的(便於整合到應用中,避免單獨移動boost的相關動態連接庫)
runtime-link是share的,這樣可以動態調用c/C++運行時庫,方便
(5)degug版本的庫名稱: 含有gd
release版本中的庫名稱;不含有gd
(6)threading,設置mutl 多線程的庫,則庫名稱包含:mutl
如果是單線程,則沒有mutl
(7)我們還可以分析一下 boost 庫的命名特點
- 以“lib”開頭的是“link=static”版本(靜態鏈接庫版本,沒有dll),而直接以“boost”開頭的是“link=shared”版本(動態鏈接庫版本,包含lib和dll)。
- 所有的庫都含有"boost"前綴。
- 緊隨其后的是boost庫名稱(比如date_time庫)。
- 然后是編譯器的版本,與庫名稱之間以"-"而不是下划線"_"分隔(比如 -vc120)。
- 有“mt”的為“threading=multi”版本,沒有的則是“threading=single”版本。
- 有“s”的為“runtime-link=static”版本,沒有的則是“runtime-link=shared”版本。
- 有“gd”的為debug版本,沒有的則是release版本。
- 所有的庫都含有boost庫的版本號結尾(比如1_56,其中的"."以下划線"_"代替)
在IDE中關聯Boost庫,我的項目都是采用CMake方式創建的
QTCreator 中點擊左側的項目菜單,在CMake參數表格中添加
Boost_INCLUDE_DiR 設置為 "boost_1_70_0\include\boost-170"
Boost_DIR 設置成 "boost_1_70_0\lib\cmake\Boost-1.70.0"
點擊 apply Configuration Changes,編譯參數。
MSVC 中,先使用CMake-GUI工具打開CMake項目,設置參數同樣,
點擊Configure,編譯參數。
CMakeLists.txt 包括
find_package(Boost 1.70.0 REQUIRED)
if(Boost_FOUND)
set(Boost_LIBRARY_DIRS D:/ScanSource/download/Boost/vc141_64/lib)
message(Boost_INCLUDE_DIRS " ${Boost_INCLUDE_DIRS}")
message(Boost_LIBRARY_DIRS " ${Boost_LIBRARY_DIRS}")
endif()
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
注意事項
1、CMake網站有引用Boost的約定參數說明,引用過程中出錯可以參考文檔說明。
2、注意使用的Boost的版本,路徑是否與項目一致,出現錯誤一般都是沒有找到頭文件路徑、沒有找到Lib路徑、使用的32位與64位版本錯誤,使用的動態庫、靜態庫版本錯誤。
通過生成的文件名可以區分,了解“mt”“s”"gd" ,“lib”“dll”的意思,如果一切順利就可以放心使用了。