庫的 link 和 runtime-link,搭配shared 和 static

參考:

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)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章