我有以下问题,似乎没有一个很好的解决方案。
例如,我有一个使用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
进行正确关联?
This问题是相关的,但我认为重新打包系统{{1}}文件并不是一个好主意。
答案 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的静态链接是一个坏主意。我建议使用混合链接。