參考:
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1300328832.A.html
http://noteonx.blogspot.com/2009/04/boost.html
http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html
C / C++庫的形式,好暈啊!
boost庫在build時,./b2 install 後面可以跟一些參數,涉及到動態庫、靜態庫的參數有以下四種搭配方式:
link=static runtime-link=static
link=static runtime-link=shared
link=shared runtime-link=shared
link=shared runtime-link=static (這種配置我試的結果是,報錯,這樣的搭配是非法的)
究竟它們都是什麼意思呢?
我的粗淺理解:
link=static runtime-link=static
build出來的就是.a (windows .lib) 文件,沒有.so (windows .dll) 文件,link到可執行程序中以後,就成爲後者的一部分,和後者融爲一體了
link=static runtime-link=shared
build出來的同時有 .a (windows .lib) 文件和 .so (windows .dll) 文件,link時,是指定 .a (windows .lib) 文件,後者成爲可執行程序的一部分,運行時,通過融入可執行程序的 .a (windows .lib) 的信息,去動態加載 .so (windows .dll) 文件,其實質仍然是動態鏈接
link=shared runtime-link=shared
build出來的只有 .so (windows .dll) 文件,沒有.a (windows .lib) 文件,但是,可執行程序在運行時,怎麼找到動態庫文件並加載它呢?
網上看到的最多的介紹文章是下面這樣的:
link:生成動態鏈接庫/靜態鏈接庫。生成動態鏈接庫需使用shared方式,生成靜態鏈接庫需使用
static方式。
runtime-link:動態/靜態鏈接C/C++運行時庫。同樣有shared和static兩種方 式,這樣runtime-link和link一共可以產生4種組合方式。雖然它和link屬性沒有直接關係,但我們習慣上,一個工程如果用動態鏈接那麼所 有庫都用動態鏈接,如果用靜態鏈接那麼所有庫都用靜態鏈接。所以這樣其實只需要編譯2種組合即可,即link=shared runtime-link=shared和link=static runtime-link=static。
還有人總結windows下boost庫的命名特點:
link=static runtime-link=static 得到 libboostxxxxx.lib
link=shared runtime-link=shared 得到 boostxxxx.lib 和 boostxxxx.dll
由以上的文件夾層次結構基本就可以得出結論:
1、以“lib”開頭的是“link-static”版本的,而直接以“boost”開頭的是“link-shared”版本的。
2、有“d”的爲debug版本,沒有的則是release版本。
3、有“s”的爲“runtime-link-static”版本,沒有的則是“runtime-link-shared”版本。
4、有“mt”的爲“threading-multi”版本,沒有的則是“threading-single”版本。
一位在微軟做過編譯器開發的大牛是這樣解釋的:
假設一個庫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) |