2010-10-14 109 views
3

我有以下問題,這似乎沒有一個很好的解決方案。靜態庫自動發現和鏈接

例如,我有一個使用libtiff和libX11的CLI實用程序。我想生成這個實用程序的兩個版本:動態鏈接和靜態鏈接(儘可能多地編譯依賴關係)。

對於動態鏈接,一切都起到了魅力的作用:一個需要指定-ltiff -lX11,鏈接器將生成一個很好的可執行文件,指向libtiff.solibX11.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輸出靜態鏈接。如何在這種情況下正確鏈接到libX11libc

This問題是相關的,但我認爲重新包裝系統.a文件不是好主意。

+0

@nos:當我把庫放在目標文件之前,例如'$(LD)$(LDFLAGS)-o $ @ $(LIBS)$(OBJ)'那麼我就不能再鏈接了:幾個屏幕的「未定義的引用」。 – 2010-10-14 22:59:50

+0

您是否找到解決方案?我基本上在同一個問題上掙扎。 – augustin 2010-10-28 10:10:18

+0

@augustin:不。正如我所提到的,libtool看起來是針對這個問題的,但我沒有時間研究它並集成到autoconf的頂端。也許你會成功。 – 2010-10-29 11:05:56

回答

3

對於爲pkg-config像X11R7庫提供.PC文件庫做:

% pkg-config --static --libs x11 
-lX11 -lpthread -lxcb -lXau 

不幸的是,pkg-config --list-all似乎並沒有表現出的libtiff作爲 圖書館提供這些的一個,但你可以至少把你的鏈接命令到:

g++ -static-libgcc -Wl,-static -o my.out *.o -lc -ltiff -ljpeg -lz `pkg-config --static --libs x11` 

再不用擔心跟蹤的什麼庫,的libx11的版本需要(SIN ce libxcb是可選的直到最近,所以較舊的Linux發行版可能沒有它)。

+0

感謝您的信息!事實上,在某些情況下,信息缺失或不完整。例如,'pkg-config --static --libs GraphicsMagick ++'將只返回GraphicsMagick庫,而正確的列表更長(參見'GraphicsMagick ++ - config --libs')。它是包維護者任務還是包開發者提供關於庫的正確信息? – 2010-11-15 15:05:09

+0

對於大多數使用pkg-config信息的軟件包,它來自上游開發者,儘管軟件包維護者可能會在構建軟件包時對其進行修補。 – alanc 2010-11-15 18:35:55

+0

謝謝。也許你可以幫助我如何正確鏈接與libX11和libc靜態(請參閱原文)?我非常感謝。 – 2010-11-16 15:32:19

0

在你的情況下,glibc的靜態鏈接是一個壞主意。我建議使用混合鏈接。

+0

如果你使用Cygwin'gcc'進行編譯,並且你希望獲得一個monolith可執行文件,這可能是個好主意。 Win32的。什麼是混合鏈接?部分動態/部分靜態?那很明顯。 – 2012-10-03 15:37:57

+0

是的,我的意思是部分動態/部分靜態鏈接。 – 2012-10-03 16:45:27