2017-08-07 59 views
0

在automake的,我有一個第三方的靜態庫,我在它上面建立一個靜態庫,我想在我的庫靜態鏈接可執行使用:靜態庫包括在內,但符號懸而未決

libthird.a, libmy.a, progs... 

我編譯libmy.a用(Makefile.am):

noinst_LIBRARIES = libmy.a 
...sources... 
libmy_a_LIBADD = libthird.a 

當我編譯和鏈接調用libmy功能前衛,它拒絕連接,通過libmy使用的所有libthird符號給未解決的錯誤。

作爲一個嘗試,我換成

​​

libmy_a_LIBADD = $(LIB_THIRD_OBJS) 

即明確從libthird.a構建的目標文件,和它的作品。第一種情況我做錯了什麼? libmy.a包含在第一種情況下libthird.a(即less libmy.a顯示對象文件和libthird.a)

至於另一次嘗試,我跑ar上libmy.a,餵養它libthird.a,生產libmyA.a,並且這也適用:與libmyA.a鏈接的progs已經正確解析了libthird符號。

還是不可能,因爲(我認爲)在這裏解釋:Embed all external references when creating a static library

回答

0

爲什麼不:

prog_LDADD = libmy.a libthird.a 

你也應該忽略:

​​

在這種情況下,因爲libmy.a是一個靜態的便利庫,所以沒有真正的重點,進一步將它鏈接。

+0

謝謝。我的問題不是很好。我編輯它以更好地反映我在做什麼。你說的話在我最初描述的情況下會起作用,但是我需要libmy.a來包含libthird符號,因爲我要在我描述的makefile之外鏈接程序。 – user907323

+0

然後'libmy.a'可能不應該是一個便利的庫。你說:「我需要libmy.a來包含libthird符號,因爲我要在我描述的makefile之外鏈接程序。」 _不在lib中有libthird符號不會阻止 - 它們只會鏈接'libmy.a'和'libthird.a'。或者像[this](https://stackoverflow.com/a/23432530/425738)將靜態庫組合成一個他們可以鏈接的庫(就像你說的那樣)。這是你用靜態庫獲得的基本選擇。 – ldav1s

+0

謝謝,後者是我正在尋找的。至於將可執行文件與'libmy.a'和'libthird.a'鏈接起來 - 這是我想避免的,因爲'libmy.a'是'libthird.a'的低級實現之上的抽象。 – user907323