2017-02-17 2 views
0

Ich versuche, eine Demo zu kompilieren, die zlib verwendet, und ich denke, ich habe richtig für LD_LIBRARY_PATH eingerichtet, aber es funktioniert nicht mit -lz Flagge, würden Sie mir bitte helfen, das Problem zu finden ?LD_LIBRARY_PATH funktioniert nicht

[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$ 

Das Problem ist, dass, wenn ich -L verwenden zu zwingen, den Ordner suchen, es funktioniert, wenn ich diesen Ordner in LD_LIBRARY_PATH setzen, funktioniert es nicht. Ich bin mir ziemlich sicher, dass ich export LD_LIBRARY_PATH verwendet habe, aber es funktioniert immer noch nicht.

Das ist ärgerlich, denn wenn ich den Code von jemand anderem kompilieren muss, ist es einfacher, eine Umgebungsvariable einzurichten, um nach den Bibliotheken zu suchen.

-------------- aktualisieren ------------

auf einem anderen Server ich das ausprobiert und es funktioniert reibungslos

[[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]$ 

Also kann meine Konfiguration korrekt sein? Irgendwelche Ideen? Ich habe es auf meinen Laptops mit Ubuntu 16.04 und Fedora 25 versucht, am 16. Februar 2017 auf stabil aktualisiert. Der Server kann ich nur sagen, es ist nicht neu aktualisiert. Ich frage mich, ob es ein Problem mit dem neuesten gcc gibt?

-------------- aktualisieren ------------

ich kann wissen, was das Problem verursacht. Die Fehlermeldung lautet cannot find -lz. Es scheint -lz als eine einzige Datei zu behandeln. Ich finde, es gibt beide -l und -z Flag in der Verwendung von ld, während es -lz in etwas wie das konvertieren kann und wir haben keinen Parameter für beide Flags und dann kombinieren sie zusammen als eine einzige Dateiparameter? Nicht sicher über meine Schlussfolgerung, aber hat jemand eine Idee, wie man mit diesem Fall umgehen soll?

-------------- aktualisieren ------------

Vollmakefile

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

clean: 
     rm -f *.o 

------ -------- Update ------------

Der 3. Abschnitt möglicherweise keine gültige Erklärung, weil nach dem Hinzufügen -V zu cc, ich habe gefunden, -lz ist erfolgreich an den Linker übergeben

+0

Bitte zeigen Sie uns den relevanten Teil des Makefiles, typisch jene Zeilen, die den Linker aufrufen. – alk

Antwort

3

LD_LIBRARY_PATH ist zum Suchen nach freigegebenen Bibliotheken zur Laufzeit. In Ihrem Fall möchten Sie einen Pfad zum Zeitpunkt der Kompilierung angeben ... Dies ist standardmäßig keine Umgebungsvariable (außer Ihr Makefile betrachtet Ihre Umgebung explizit). Sie müssen es in der Befehlszeile an den Compiler übergeben, zB:

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

Vielen Dank für Ihre Antwort, während, tatsächlich gibt es sowohl libz.so und libz.a in diesem Ordner. Ich glaube, egal, ob es nach einer gemeinsam genutzten Bibliothek oder einer statischen Bibliothek sucht, es sollte es finden. Außerdem muss -lz vor -L gesetzt werden, da der Pfad vor dem Laden der Bibliothek geladen werden muss. Das ist nicht mein Makefile, es stammt von der Website des Bibliotheksautors und deshalb möchte ich eine Umgebungsvariable haben, anstatt "-L" zu verwenden, weil ich das Makefile nicht ändern möchte. Noch mehr Ideen dazu? –

+1

@SanhuLi: Überprüfen Sie das Makefile, ob es "LDFLAGS" oder ähnliches verwendet, wenn Sie den Linker aufrufen. Sie könnten dann dieses env/var/vor dem Ausführen von 'make' setzen. Und BTW, * kcraigie * hat vollkommen recht damit, dass 'LD_LIBRARY_PATH' vom Linker nicht benutzt wird, um Bibliotheken zu durchsuchen. – alk

+0

@alk Vielen Dank für Ihre Hilfe, während ich mit Ihrer Idee nicht einverstanden bin. Der erste Abschnitt zeigt den Wert von LD_LIBRARY_PATH vor dem Aufruf von make. Der Wert von LD_LIBRARY_PATH ist bereits festgelegt. Und es ist traurig, dass das Makefile LDFLAGS nicht verwendet. Der zweite Abschnitt läuft auf einem Server, auf dem gcc4.9 läuft, zumindest durchsucht er LD_LIBRARY_PATH und findet die Bibliothek. Bitte nicht das Makefile verwendet -static Flag nicht und wenn es die Verknüpfung macht, glaube ich, dass es zuerst nach dynamischen Linking-Dateien suchen wird, und dies wird durch das LDD-Ergebnis angezeigt, es verwendet die .so-Datei in der LD_LIBRARY_PATH. –

0

Endlich eine Lösung für sie finden. Verwenden Sie nicht einfach LD_LIBRARY_PATH und verwenden Sie stattdessen LIBRARY_PATH. Es funktioniert gut und reibungslos. Holen Sie sich die Idee von GNU ld cannot find library which is there Noch nicht klar, was der Grund ist, aber zumindest funktioniert es jetzt gut.

[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$ 
Verwandte Themen