为什么GCC链接到libz?

时间:2015-01-21 15:25:31

标签: gcc linker shared-libraries ld

  

gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I / home / vagrant / python / include / python2.7 -c external / KentLib / wWigIO / wWigIO.c -o build / temp.linux-i686-2.7 / external / KentLib / wWigIO / wWigIO.o -w -shared -fPIC -p -Iexternal / KentLib / inc

然后:

  

gcc -pthread -shared build / temp.linux-i686-2.7 / external / KentLib / wWigIO / wWigIO.o -o build / lib.linux-i686-2.7 / wWigIO.so -DMACHTYPE_x86_64 -lz - lm external / KentLib / lib / jkweb.a

(对不起这些命令的混乱我想逐字复制它们以避免遗漏重要细节)

然后,我查看符号,注意compress未定义:

$ nm build/lib.linux-i686-2.7/wWigIO.so | grep compress
         U compress
0002486d t getDecompressor
00024b28 T lineFileDecompress
00024c0f T lineFileDecompressFd
00024c8b T lineFileDecompressMem
         U uncompress
00037cd2 T zUncompress

它似乎无法链接到libmlibz

$ ldd build/lib.linux-i686-2.7/wWigIO.so
    linux-gate.so.1 =>  (0xb76e2000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7668000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74be000)
    /lib/ld-linux.so.2 (0xb76e3000)

我知道libz已经安装并且在搜索路径中:

$ sudo cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
$ sudo cat /etc/ld.so.conf.d/*.conf
# Multiarch support
/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu
/lib/i686-linux-gnu
/usr/lib/i686-linux-gnu
# libc default configuration
/usr/local/lib

libz位于以下位置:

$ locate libz
/lib/i386-linux-gnu/libz.so.1
/lib/i386-linux-gnu/libz.so.1.2.3.4
/usr/lib/i386-linux-gnu/libz.a
/usr/lib/i386-linux-gnu/libz.so

我可以看到libz.so

中定义的符号
$ nm -D /usr/lib/i386-linux-gnu/libz.so | grep compress
00001d60 T compress
00001c70 T compress2
00001da0 T compressBound
00003d20 T uncompress

我能让它工作的唯一方法是将gcc命令更改为此(添加粗体部分):

  

gcc -pthread -shared build / temp.linux-i686-2.7 / external / KentLib / wWigIO / wWigIO.o -o build / lib.linux-i686-2.7 / wWigIO.so -DMACHTYPE_x86_64 -lz -lm external / KentLib / lib / jkweb.a /usr/lib/i386-linux-gnu/libz.a

这对我没有意义。为什么libn不会链接?

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方案。

如果我设置LDFLAGS='-Wl,--no-as-needed -lz'那么它确实链接到libz,并且编译的共享库现在不会得到未定义的符号错误。

然而,我仍然感到困惑的是,为什么它只是通过提供-lz标志来链接到libz。