簡體   English   中英

是否可以在C / C ++的其他庫中包含靜態鏈接的庫?

[英]Is it possible to include statically linked libraries in other libraries in C/C++?

在我的項目中,靜態鏈接庫中有一些共享代碼,供幾個子項目使用,每個子項目都構建自己的可執行文件。 我使用ar.o文件創建庫。 共享代碼的一部分取決於靜態鏈接的第三方庫。

當前,我必須在每個makefile中(對於每個可執行文件)包括所有第三方庫,並將它們傳遞給g++ 是否可以將這些庫包含在子項目共享的一個庫中,所以在構建不同的可執行文件時不必顯式引用它們? 還是我的方法總體上有問題?

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

處理這種情況的常用方法是在頂級makefile或幾個makefile包含的.inc文件中定義變量

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

然后將這些變量添加到標准變量中

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

上面的變量由GNU Make隱式鏈接規則使用; 如果您使用自己的規則,請確保使用以下變量,如下所示:

...
g++ $^ $(LDLIBS) $(LDFLAGS) -o $@

查看已建立的開源項目中的幾個makefile,以獲取啟發。

參考文獻:

不是您想要的方式。 基本上,靜態庫只是一堆要鏈接的目標文件,而且一個目標文件不可能暗示自動包含另一個目標文件。 因此,靜態庫無法要求另一個靜態庫自動包含在鏈接中。 另一方面,對於動態庫,該庫本身可以引用(動態)鏈接到的另一個庫。

可以做的是使用隱式鏈接程序腳本來代替靜態庫,該腳本說明應包含哪個庫。 例如在libfoo.a

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

這意味着-lfoo告訴鏈接器包括-lreal-foo (這將意味着原始的.a文件)和-lbar ,這將意味着鏈接器所依賴的庫。

可行的方法是,每當鏈接器被告知與libfoo.a鏈接時,它將在意識到它不是歸檔文件(即.a文件)或目標文件時將嘗試將其解釋為鏈接器腳本。 然后, INPUT命令指示鏈接器包括該點所指定的那些文件,特別是如果它們以-lFILE形式-lFILE ,它將如同-lFILE被包含在命令行中一樣-lFILE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM