2017-02-17 8 views
0

Я пытаюсь скомпилировать демо, в котором используется zlib, и я думаю, что я сделал правильный набор для LD_LIBRARY_PATH, но он не работает с флагом -lz, не могли бы вы помочь мне найти, в чем проблема ?LD_LIBRARY_PATH не работает

[email protected]:kseq$ echo $LD_LIBRARY_PATH 
/home/lisanhu/mine/repos/zlib/output/lib 
[email protected]:kseq$ make 
gcc -g -O2 kseq_test.c -o kseq_test -lz 
/usr/bin/ld: cannot find -lz 
collect2: error: ld returned 1 exit status 
Makefile:3: recipe for target 'all' failed 
make: *** [all] Error 1 
[email protected]:kseq$ gcc -static -o kseq_test kseq_test.o -lz -L/home/lisanhu/mine/repos/zlib/output/lib 
[email protected]:kseq$ 

Проблема заключается в том, что если я использую -L, чтобы заставить искать папку, она работает, если я ставлю эту папку в LD_LIBRARY_PATH, он не работает. Я уверен, что использовал export LD_LIBRARY_PATH, но он все еще не работает.

Это раздражает, потому что, если мне нужно скомпилировать чужой код, который ему нужен, проще настроить переменную среды для поиска библиотек.

-------------- Обновление ------------

На другом сервере я попробовал это, и это работает плавно

[[email protected] tmp]$ export LD_LIBRARY_PATH=/home/1677/mine/repos/zlib/zlib-1.2.8 
[[email protected] tmp]$ ls 
gmon.out kseq.h kseq.tar kseq_test kseq_test.c Makefile 
[[email protected] tmp]$ make 
cc -g -O2 kseq_test.c -o kseq_test -lz 
[[email protected] tmp]$ ldd kseq_test 
    linux-vdso.so.1 => (0x00007fffb01a6000) 
    libz.so.1 => /home/1677/mine/repos/zlib/zlib-1.2.8/libz.so.1 (0x00007f9556c83000) 
    libc.so.6 => /lib64/libc.so.6 (0x00000031fa400000) 
    /lib64/ld-linux-x86-64.so.2 (0x00000031fa000000) 
[[email protected] tmp]$ 

Итак, моя конфигурация может быть правильной? Есть идеи? Я пробовал это на своих ноутбуках с Ubuntu 16.04 и Fedora 25, обновленный до стабильного 16 февраля 2017 года. Сервер, о котором я могу только сказать, не обновляется. Мне интересно, есть ли проблемы с новейшим gcc?

-------------- Обновление ------------

я могу знать, что вызывает проблему. Сообщение об ошибке: cannot find -lz. Кажется, что обрабатывает -lz как отдельный файл. Я нахожу, что есть и -z флаг в использовании ld, в то время как он может конвертировать -lz в нечто подобное и найти, что у нас нет параметра для обоих флагов, а затем объединить их как один параметр файла? Не совсем уверен в моем умозаключении, но кто-нибудь знает, как справиться с этим делом?

-------------- Обновление ------------

Полный Makefile

all:kseq.h kseq_test.c 
     $(CC) -g -O2 kseq_test.c -o kseq_test -lz 

clean: 
     rm -f *.o 

------ -------- Обновление ------------

3-й раздел может быть недействительным, потому что после добавления -v к cc я нашел -lz успешно передается компоновщику

+0

Просьба показать нам соответствующую часть файла Makefile, типичную для линий, ссылающихся на компоновщик. – alk

ответ

3

LD_LIBRARY_PATH предназначен для поиска разделяемых библиотек во время выполнения. В вашем случае вы хотите указать путь во время компиляции ... по умолчанию это не переменная среды (если ваш make-файл явно не смотрит в вашу среду). Вам необходимо передать его в командной строке в компилятор, например:

gcc -g -O2 kseq_test.c -o kseq_test -L /home/lisanhu/mine/repos/zlib/output/lib -lz 
+0

Благодарим вас за ответ, в то время как на самом деле есть и libz.so и libz.a в этой папке. Я считаю, что независимо от того, что он ищет общую библиотеку или статическую библиотеку, она должна ее найти. Также мне нужно поставить -lz до -L, потому что ему нужно загрузить путь до загрузки библиотеки. Это не мой Makefile, это с сайта автора библиотеки, поэтому я хочу иметь решение переменной окружения вместо использования '-L', потому что я не хочу менять Makefile. Есть еще идеи об этом? –

+1

@SanhuLi: проверьте Makefile, использует ли он LDFLAGS или аналогично при вызове компоновщика. Затем вы можете установить этот env/var/перед запуском 'make'. И BTW, * kcraigie * совершенно правы с тем, что 'LD_LIBRARY_PATH' не используется компоновщиком для поиска libs. – alk

+0

@alk Спасибо за вашу помощь, в то время как я не согласен с вашей идеей. В первом разделе показано значение LD_LIBRARY_PATH перед вызовом make. Значение LD_LIBRARY_PATH уже установлено. И грустно, что Makefile не использует LDFLAGS. Второй раздел работает на сервере с gcc4.9, по крайней мере, он искал LD_LIBRARY_PATH и нашел библиотеку. Пожалуйста, не Makefile не использует -статический флаг, и когда он выполняет привязку, я считаю, что сначала он будет искать динамические файлы связывания, и это показано результатом ldd, он использует .so-файл в LD_LIBRARY_PATH. –

0

Наконец-то найдите решение. Просто не используйте LD_LIBRARY_PATH и вместо этого используйте LIBRARY_PATH. Он работает нормально и плавно. Получите идею от GNU ld cannot find library which is there Все еще неясно, в чем причина, но по крайней мере сейчас она отлично работает.

[email protected]:kseq$ export LD_LIBRARY_PATH=~/mine/repos/zlib/output/lib; 
[email protected]:kseq$ make 
cc -g -O2 kseq_test.c -o kseq_test -lz 
/usr/bin/ld: cannot find -lz 
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation) 
Makefile:2: recipe for target 'all' failed 
make: *** [all] Error 1 
[email protected]:kseq$ ls 
kseq.h kseq_test.c kseq_test.o Makefile test.seq 
[email protected]:kseq$ export LIBRARY_PATH=~/mine/repos/zlib/output/lib; 
[email protected]:kseq$ make 
cc -g -O2 kseq_test.c -o kseq_test -lz 
[email protected]:kseq$ ls 
kseq.h kseq_test kseq_test.c kseq_test.o Makefile test.seq 
[email protected]:kseq$ ldd kseq_test 
    linux-vdso.so.1 => (0x00007fffcd135000) 
    /lib/$LIB/liblsp.so => /lib/lib/x86_64-linux-gnu/liblsp.so (0x00007f5fe93cb000) 
    libz.so.1 => /home/lisanhu/mine/repos/zlib/output/lib/libz.so.1 (0x00007f5fe91b1000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5fe8dca000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5fe8bc6000) 
    /lib64/ld-linux-x86-64.so.2 (0x000056051fc0c000) 
[email protected]:kseq$ 

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

  • Нет связанных вопросов^_^