我有以下问题,似乎没有很好的解决方案。
例如,我有一个使用 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
这个问题是相关的,但我认为重新打包系统.a
文件不是一个好主意。