我有以下問題,這似乎沒有一個很好的解決方案。靜態庫自動發現和鏈接
例如,我有一個使用libtiff和libX11的CLI實用程序。我想生成這個實用程序的兩個版本:動態鏈接和靜態鏈接(儘可能多地編譯依賴關係)。
對於動態鏈接,一切都起到了魅力的作用:一個需要指定-ltiff -lX11
,鏈接器將生成一個很好的可執行文件,指向libtiff.so
和libX11.so
。
靜態鏈接的情況變得更糟。當我使用以下命令:
g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -lX11
它以libtiff.a和libX11.a中的錯過的符號結束。好吧,我可以把他們依賴的所有庫放到一行中:
g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -ljpeg -lz -lX11 -lXau -lxcb -lXdmcp
但是有什麼工具可以讓我發現這個發現嗎? libtool可以在這裏幫助(我看到/usr/lib/libtiff.la
但沒有/usr/lib/libX11.la
)?有人可以提供一個libtool的基本示例嗎?這種情況非常重要,如果在某些平臺上libtiff
提供了較窄的功能並且沒有鏈接到根本不可用於該平臺的libjpeg
,所以上面的鏈接命令將因未滿足的庫依賴性而失敗。
的第二個問題是由於警告(我相信):
/usr/lib/libX11.a(xim_trans.o): In function `_XimXTransSocketUNIXConnect':
(.text+0xcda): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
實用性並不反對libc
,這仍顯示在ldd
輸出靜態鏈接。如何在這種情況下正確鏈接到libX11
和libc
?
This問題是相關的,但我認爲重新包裝系統.a
文件不是好主意。
@nos:當我把庫放在目標文件之前,例如'$(LD)$(LDFLAGS)-o $ @ $(LIBS)$(OBJ)'那麼我就不能再鏈接了:幾個屏幕的「未定義的引用」。 – 2010-10-14 22:59:50
您是否找到解決方案?我基本上在同一個問題上掙扎。 – augustin 2010-10-28 10:10:18
@augustin:不。正如我所提到的,libtool看起來是針對這個問題的,但我沒有時間研究它並集成到autoconf的頂端。也許你會成功。 – 2010-10-29 11:05:56