为什么 GCC link 不支持 libz?
Why won't GCC link to libz?
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
它似乎没有链接到 libm
或 libz
:
$ 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
这对我来说毫无意义。为什么 libz 不链接?
我想出了一个解决方案。
如果我设置 LDFLAGS='-Wl,--no-as-needed -lz'
那么它确实 link 到 libz 并且编译的共享库现在不会出现未定义的符号错误。
但是,我仍然很困惑为什么它不通过提供 -lz
标志 link 到 libz。
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
它似乎没有链接到 libm
或 libz
:
$ 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
这对我来说毫无意义。为什么 libz 不链接?
我想出了一个解决方案。
如果我设置 LDFLAGS='-Wl,--no-as-needed -lz'
那么它确实 link 到 libz 并且编译的共享库现在不会出现未定义的符号错误。
但是,我仍然很困惑为什么它不通过提供 -lz
标志 link 到 libz。