2011-05-27 90 views
2

說我有一個libmy.a靜態庫,我想知道它動態鏈接的庫。其實我需要以下內容:我將創建一個新的動態lib,說libmy2.so它將鏈接說.o文件(對象文件)和libmy.a。所以我想知道什麼庫最終會加載libmy2.so。我如何知道哪些庫被動態鏈接到靜態庫中?

回答

1

靜態庫不會鏈接其他靜態或動態庫。 OK,假設有兩個C++文件,a.cp​​p和b.cpp。

g++ -c a.cpp -o a.o   // compile a.cpp to a.o 
rm -f lib1.a    // no existing lib1.a (this is not essential) 
ar rvs lib1.a a.o   // create library lib1.a and add a.o to it 
g++ -c b.cpp -o b.o   // compile b.cpp to b.o 
ar rvs lib1.a b.o   // ad b.o to existing lib1.a 

顯而易見,您可以在各個階段之間進行任意數量的複製以生成具有所需名稱的庫。你也可以做

ar --help 

獲得可能略微簡化的過程中AR選項。坦率地說,這是一個我幾乎從不使用的命令,除了從對象列表中構建靜態庫。

+0

特別是,你有沒有意識到我不能建立一個靜態鏈接庫,靜態鏈接其他庫? – Narek 2011-05-27 17:31:52

+0

@Narek是的 - 應用程序或共享庫可以鏈接到其他靜態或共享庫,但靜態庫不能,因爲它們只是對象文件的歸檔。 – 2011-05-27 17:34:44

+0

鏈接到一個目標文件的一堆目標文件,即一個靜態庫,並得到對象文件+ 1靜態庫的邊界? – Narek 2011-05-27 17:37:22

0

可以使用folllowing命令檢查靜態庫的內容:

nm -C libname.a | less 

$ar -vt libname.a 
0
在Mac上

,這將是 納米-mÇlibName.a的

0

動態庫只會動態鏈接到您在構建它時使用-l指定的動態庫。靜態庫主要是鏈接表示一組* .o文件的時間實體,並且它們必須由鏈接器處理以生成可執行代碼,因此不需要在構建靜態庫時提供所有實現。所有這些都是在目標可執行文件的最終鏈接期間設置的。