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输出中。在这种情况下,如何正确地与libX11和静态链接?libc

这个问题是相关的,但我认为重新打包系统.a文件不是一个好主意。

4

2 回答 2

3

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

% 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 发行版可能没有它)。

于 2010-11-14T18:26:45.143 回答
0

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

于 2012-10-03T13:33:36.080 回答