2015-01-21 2 views
0

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 построить/temp.linux-i686-2.7/внешний/KentLib/wWigIO/wWigIO.o -w -shared -fPIC -p -Iexternal/KentLib/вклПочему GCC не ссылается на libz?

Тогда :

GCC -pthread -shared сборки/temp.linux-i686-2.7/внешний/KentLib/wWigIO/wWigIO.o -o построить/lib.linux-i686-2.7/wWigIO.so -DMACHTYPE_x86_64 - lz -lm внешний/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 не связываться?

+0

Попробуйте следующее: http://stackoverflow.com/questions/3373995/usr-bin-ld-cannot-find-lz ... и это: http://openacs.org/forums/message-view?message_id = 88831 –

+0

@JoachimPileborg, он ссылается на него ... один из исходных файлов вызывает compress(). Этот исходный файл имеет #include

ответ

0

Я как-то понял решение.

Если я установил LDFLAGS='-Wl,--no-as-needed -lz', он действительно ссылается на libz, и скомпилированная общая библиотека теперь не получает неопределенную ошибку символа.

Однако я все еще смущен, почему он не ссылается на libz, просто указав флаг -lz.

Смежные вопросы