静态库自动发现和链接

时间:2010-10-14 11:45:47

标签: c gcc static-linking

我有以下问题,似乎没有一个很好的解决方案。

例如,我有一个使用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仍显示在libX11输出中。在这种情况下,如何正确地与libc.a进行正确关联?

This问题是相关的,但我认为重新打包系统{{1}}文件并不是一个好主意。

2 个答案:

答案 0 :(得分:3)

对于为pkg-config提供 .pc 文件的库,如X11R7库,请执行以下操作:

% 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版本所需的库(因为libxcb直到最近都是可选的,所以旧的Linux发行版可能没有它。)

答案 1 :(得分:0)

在你的情况下,glibc的静态链接是一个坏主意。我建议使用混合链接。