原文:
boost官網的《geting started on windows》(
)提到了boost庫的命名,摘錄如下:
以 libboost_regex-vc71-mt-d-1_34.lib 為例:
下表是對regex庫編譯後的檔名:
檔名含義編譯使用該庫的程式時應使用的編譯選項
libboost_regex-vc90-mt-sgd-1_38.lib
靜態庫,多執行緒,除錯版本
使用靜態除錯版本c執行時庫(libcmtd.lib和libcpmtd.lib)
/mtd
libboost_regex-vc90-mt-s-1_38.lib
靜態庫,多執行緒
使用靜態版本c執行時庫(libcmt.lib和libcpmt.lib)
/mtlibboost_regex-vc90-mt-gd-1_38.lib
靜態庫,多執行緒,除錯版本
使用動態除錯版本c執行時庫(msvcrtd.lib和msvcprtd.lib)
/mdd
libboost_regex-vc90-mt-1_38.lib
靜態庫,多執行緒
使用動態版本c執行時庫(msvcrt.lib和msvcprt.lib)
/mdboost_regex-vc90-mt-gd-1_38.lib
導入庫(boost_regex-vc90-mt-gd-1_38.dll),多執行緒,除錯版本
boost_regex-vc90-mt-1_38.lib
導入庫(boost_regex-vc90-mt-1_38.dll)多執行緒
需要注意的是,鏈結時,所使用的regex庫檔名必須和編譯選項匹配,否則會造成如下鏈結錯誤:
link : warning lnk4098: defaultlib '×××××' conflicts with use of other libs; use /nodefaultlib:library
原因是,當編譯時,cl.exe(也就是vc的編譯器)會根據上述編譯選項在編譯成的obj檔案中植入相應的defaultlib檔名(使用dumpbin /directive***,lib可以檢視),如/mt對應的就是libcmt.lib(c)和libcpmt.lib(c++標準庫)。當鏈結器處理該obj檔案時,會從檔案中取出該defaultlib檔名,將其放在命令行庫列表的最後以供使用。對於靜態庫的處理也是如此,靜態庫也是由一些obj檔案組成的,每個obj檔案中也根據當時的編譯選項被植入了相應的defaultlib。當鏈結器處理靜態庫時,也會將涉及到的obj檔案中的defaultlib放在命令行庫列表的最後。假設,我們的程式使用/mt編譯,那個對應的defaultlib就是libcmt.lib(c)和libcpmt.lib(c++標準庫)。而使用的是libboost_regex-vc90-mt-sgd-1_38.lib,它對應的defaultlib就是libcmtd.lib和libcpmtd.lib。鏈結過程中,鏈結器會發現採用了不同的執行時庫,所以會出現上述錯誤。
boost.regex預設使用的靜態鏈結方式,如果希望使用動態鏈結方式,如何實現呢? 定義巨集boost_regex_dyn_link。要注意,一定要在包含regex標頭檔案之前定義該巨集。
Boost庫的命名規則
本部落格 http blog.csdn.net livelylittlefish 貼出作 者 三二一 小魚 相關研究 學習內容所做的筆記,歡迎廣大朋友指正!boost 庫的命名規則 例如 win32平台 linux平台 命名規則 字首 lib,但在win32平台,只有靜態庫有lib字首 庫名稱 以b...
Boost庫編譯後命名方式
boost官網的 geting started on windows http www.boost.org doc libs 1 38 0 more getting started windows.html 提到了boost庫的命名,摘錄如下 以 libboost regex vc71 mt d 1...
Boost庫編譯後命名方式
from boost官網的 geting started on windows 提到了boost庫的命名,摘錄如下 以 libboost regex vc71 mt d 1 34.lib 為例 下表是對regex庫編譯後的檔名 檔名含義編譯使用該庫的程式時應使用的編譯選項 libboost rege...