2015-08-26 84 views
2

在我的項目中,我有一些靜態鏈接庫中的一些共享代碼,由幾個子項目使用,每個子項目都構建自己的可執行文件。我使用ar.o文件創建庫。部分共享代碼取決於靜態鏈接的第三方庫。是否可以在C/C++的其他庫中包含靜態鏈接庫?

目前,我必須在每個makefile中包含所有第三方庫(對於每個可執行文件)並將它們傳遞給g++。是否有可能將這些庫包含在子項目共享的一個庫中,因此,在構建不同的可執行文件時,我不必明確引用它們?或者我的方法總體上有什麼問題嗎?

+1

「我[...]靜態鏈接」, 「創建共享庫」, 「使用AR來創建共享」。 ..什麼是共享/靜態似乎有矛盾。 –

+0

「共享庫」是指子項目共享的.a文件。它是一個靜態鏈接庫。我編輯了這個問題來說明問題。 – lex82

+0

當然,您可以使用'ar'來創建一個巨大的超級檔案。你也可以使用像pkg-config這樣的工具來跟蹤你的依賴關係。 –

回答

2

可以將您正在使用的所有靜態庫打包到一個大型庫中。你不想那樣。

處理情況的常用方法是定義在頂層Makefile文件變量,或在.INC文件中包含幾個生成文件:

MY_LIBS = -lOne -lTwo 
MY_LDFLAGS = -L /path/to/libs 

,然後將這些變量標準變量

LDLIBS += $(MY_LIBS) 
LDFLAGS += $(MY_LDFLAGS) 

上面的變量被GNU Make使用隱式鏈接規則;如果您使用的是自己的規則,一定要使用這些變量,像這樣:

... 
g++ $^ $(LDLIBS) $(LDFLAGS) -o [email protected] 

看從成立開源項目數makefile文件中尋找靈感。

參考文獻:

+0

謝謝,我會盡力這樣做。我可能會在makefile中有一些相對路徑問題(我試圖通過將所有東西塞進一個大型庫中來避免),但是我想我應該修復這些路徑。 – lex82

1

不是你想要的樣子。基本上靜態庫只是一堆要鏈接的目標文件,一個目標文件無法隱含另一個目標文件的自動包含。因此靜態庫不能調用另一個靜態庫被自動包含在鏈接中。另一方面,對於動態庫,庫本身可能會引用(將動態地)鏈接到的另一個庫。

可能做的是使用隱式鏈接器腳本來代替靜態庫應該包括哪個庫。例如,在libfoo.a

INPUT(-lreal-foo) 
INPUT(-lbar) 

將意味着-lfoo告知鏈接包括-lreal-foo(這將意味着你原來.a文件)和-lbar這將意味着它依賴於庫。

的工作是,每當連接器被告知與libfoo.a鏈接它會當它意識到這不是一個檔案(即.a文件)或目標文件,它會嘗試將其解釋爲一個鏈接腳本。 INPUT命令然後指示鏈接器包括那些文件,因爲它們將在該點指定,特別是如果它們在表格-lFILE上,它將起作用,就好像-lFILE包含在命令行中一樣。

+0

這樣的鏈接腳本可以像靜態庫一樣使用嗎? –

+0

@PaulGroke是的,如果鏈接器不能將其識別爲目標文件或存檔,它會嘗試將其解釋爲隱式鏈接器腳本。事實上,這已經用於(一些)x86-64 linux上的一些庫。 – skyking

+0

啊,謝謝。有趣。 :) –

相關問題