boost1.79编译
系列文章目錄
文章目錄
- 系列文章目錄
- 前言
- 一、編譯
- 1.使用vs2019 命令行,用管理員身份運行
- 2.執行命令
- 2.第二種方法
- 3.boost編譯動態庫
- 參考
前言
boost自帶一套編譯工具bjam,bjam本身是跨平臺的,并且也要自行編譯出來。在boost目錄下有bootstrap.sh和bootstrap.bat兩個腳本分別用來編譯*nix和windows下的bjam。bootstrap腳本可以傳入參數,以在編譯bjam過程中生成特定的編譯boost的配置。這些配置保存在新生成的project-config.jam里,但還可以在運行bjam的時候再傳入參數來覆蓋。同時生成的b2是bjam的代理,運行哪個的效果都差不多。
一、編譯
1.使用vs2019 命令行,用管理員身份運行
2.執行命令
1.解壓boost文件,使用編譯器的命令行進入解壓后的根目錄
2.敲入命令.\bootstrap.bat (on Windows)或者./bootstrap.sh (on other operating systems)
3.執行./b2 install --prefix=PREFIX
PREFIX就是你要安裝的目錄位置,Win32默認在 C:\Boost;Unix默認在 /usr/local on Unix. Linux
注意:執行./b2 install --prefix=PREFIX 我發現在我的c盤下面并沒有出現:C:\Boost
于是我把命令改成:./b2 install --prefix=E:\boost\boost1.79\boost_1_79_0_build
確實在E:\boost\boost1.79\boost_1_79_0_build生成了 include 和lib但是并沒有生成相應的dll
4.生成lib和dll
這時只會生成lib而沒有生成dll
命令行中敲入:./b2 install --prefix=“E:\boost\boost_1_74_0_build\x64” --build-type=complete --toolset=msvc-14.2 threading=multi --build-type=complete address-model=64
這時在E:\boost\boost_1_74_0_build\x64路徑下就會生成lib和dll
2.第二種方法
當在第一種方法執行:bjam stage --toolset=msvc-14.2 --stagedir=“D:\boost_lib” link=static runtime-link=static threading=multi debug release
會報錯:bjam : 無法將“bjam”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確
,然后再試一次。
所在位置 行:1 字符: 1
- bjam stage --toolset=msvc-14.2 --stagedir=“D:\boost_lib” link=static …
- + CategoryInfo : ObjectNotFound: (bjam:String) [], CommandNotFoundException+ FullyQualifiedErrorId : CommandNotFoundException
于是執行重新換一個命令:
./b2 toolset=msvc-14.1 link=static runtime-link=shared threading=multi variant=debug
./b2 install --prefix=“E:\boost\boost1.79\boost_1_79_0_build\vc141”
3.boost編譯動態庫
使用:./b2 toolset=msvc-14.1 link=static runtime-link=shared threading=multi variant=debug
./b2 install --prefix=“E:\boost\boost1.79\boost_1_79_0_build\vc141”
會發現只能生成lib庫和include頭文件,并不能生成dll動態庫
如果,但是運行exe程序時又需要動態庫,所以我們會需要boost生成動態庫
生成動態庫的命令:
./b2 toolset=msvc-14.1 link=shared runtime-link=shared threading=multi variant=debug
./b2 stage --prefix=“E:\boost\boost1.79\boost_1_79_0_build\vc141”
即把 “link=static“,改成
link=shared
./b2 install --prefix=“E:\boost\boost1.79\boost_1_79_0_build\vc141”
參考
luckyum
指令格式大概如下:
./b2 toolset=msvc-14.1 link=static runtime-link=shared threading=multi variant=debug
./b2 install --prefix=“D:\ScanSource\download\Boost\vc141”
重要參數
(1)stage/install:
stage表示只生成庫(dll和lib),install會生成并安裝到系統中,包含頭文件的include目錄和CMake文件夾。
(2)toolset:
指定編譯器,可選的如minGW、msvc等。
vs2017 : msvc-14.1,vs2015 : msvc-14.0, linux :gcc
(3)stagedir/prefix:
stage時使用stagedir,install時使用prefix,表示編譯生成文件的路徑,與安裝路徑。
(4)link:
生成動態鏈接庫/靜態鏈接庫。生成動態鏈接庫需使用shared方式,生成靜態鏈接庫需使用static方式。一般boost庫可能都是以static方式編譯,因為最終發布程序帶著boost的dll感覺會比較累贅。
(5)runtime-link:
動態/靜態鏈接運行時庫。同樣有shared和static兩種方式,標記如何連接C++運行庫,是包含就用靜態,使用系統運行庫就用動態。
(6)architecture
表示架構,也就是你的CPU架構,所以是x86或者arm
(7)address-model
地址長度,32表示編譯32位的庫文件,64表示編譯64位的庫文件
(8)threading:
單/多線程編譯。一般都寫多線程程序,當然要指定multi方式了;如果需要編寫單線程程序,那么還需要編譯單線程庫,可以使用single方式。
(9)variant:
編譯debug/release版本。一般都是程序的debug版本對應庫的debug版本,所以兩個都編譯。
關于生成boost文件名稱的說明,解決調用boost庫找不到文件的問題:
libboost_atomic-vc141-mt-x32-1_70.lib
libboost_atomic-vc141-mt-x64-1_70.lib
libboost_atomic-vc141-mt-gd-x64-1_70.lib
libboost_atomic-vc141-mt-gd-x32-1_70.lib
(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 和對應的 libboost_*****.lib
(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 多線程的庫,則庫名稱包含:mt
如果是單線程,則沒有mt
(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(BoostINCLUDEDIRS)linkdirectories({Boost_INCLUDE_DIRS}) link_directories(BoostI?NCLUDED?IRS)linkd?irectories({Boost_LIBRARY_DIRS})
注意事項
1、CMake網站有引用Boost的約定參數說明,引用過程中出錯可以參考文檔說明。
2、注意使用的Boost的版本,路徑是否與項目一致,出現錯誤一般都是沒有找到頭文件路徑、沒有找到Lib路徑、使用的32位與64位版本錯誤,使用的動態庫、靜態庫版本錯誤。
通過生成的文件名可以區分,了解“mt”“s”“gd” ,“lib”“dll”的意思,如果一切順利就可以放心使用了。
如果只是需要Release版本有一個Windows Binaries的下載鏈接,解壓就好了。。。。https://dl.bintray.com/boostorg/release/1.70.0/binaries/
編譯成功后運行執行檔,如果出現
error while loading shared libraries: libboost_system.so.1.52.0: cannot open shared object file: No such file or directory
是因為系統在當前注冊的搜索路徑{PATH}中找不到所需的共享庫。PATH是Enviroment Variable:
echo “$HOME”
echo “$PATH”
輸出環境變量的值;
修改或設置則可以用export指令:
export PATH=${PATH}:/usr/local/lib:/usr/local/include
總結
以上是生活随笔為你收集整理的boost1.79编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络层—简单的arp断网
- 下一篇: 哈希表与字符串--13-[剑]字符串转换