2011-09-30 60 views
0

我有2個靜態庫,cc靜態鏈接:如何導入只有一個.a庫的所有符號?

libalgha.a與2層的功能:與鏈接func3()func4()

我有1個可執行文件(mytest):func1()func2()

libbeta.a 2個功能這2個庫。可執行文件僅調用func1()func3()。所以據我所知,鏈接器只會將這兩個函數的符號放入可執行文件中。

可執行文件在運行時加載了dlopen()共享庫(libgamma.so),此共享庫使用libalgha.a的函數func2()。當運行mytest我得到的錯誤:

symbol func2: referenced symbol not found

我不能包括libalgha.alibgamma.so因爲在Solaris 32/64位問題。

那麼如何鏈接mytestlibalgha.a的所有符號?

回答

1

也許-u func2會有所幫助。請參閱manual page

不幸的是,GNU似乎沒有--whole-archive選項。

+0

感謝您的快速答覆,問題是,在現實中,有這個靜態庫中有數百個函數,這就是爲什麼我要尋找一個更通用的選項,比如「import-all-symbols-of-this-library」。事實上,--whole-archive選項在Solaris中不可用。 – jav

1

在喜歡你的節目源包括對func2參考:

extern void func2(); 
void (*pfunc2)() = func2; 

另外,整個圖書館連接成一個對象,使用ld -r,並且對象鏈接到可執行文件,而不是庫。您可能會或可能不會需要提取對象,例如,如果下面不工作:

ld -r -o libbeta.o libbeta.a 

然後做

mkdir x 
cd x 
ar x ../libbeta.a 
ld -r -o ../libbeta.o *.o 
cd .. 
rm -rf x 
相關問題