632 Stimmen

/usr/bin/ld: kann -l<NameDerBibliothek> nicht finden.

Ich versuche, mein Programm zu kompilieren, und es gibt diesen Fehler zurück:

usr/bin/ld: kann -l nicht finden

In meiner Makefile verwende ich den Befehl g++ und verlinke mit meiner Bibliothek, die ein symbolischer Link zu meiner Bibliothek ist, die sich in einem anderen Verzeichnis befindet.

Gibt es bitte eine Option, die hinzugefügt werden kann, damit es funktioniert?

642voto

dcarrith Punkte 7120

Um herauszufinden, wonach der Linker sucht, führen Sie ihn im ausführlichen Modus aus.

Zum Beispiel stieß ich auf dieses Problem, als ich versuchte, MySQL mit ZLIB-Unterstützung zu kompilieren. Während der Kompilierung erhielt ich einen Fehler wie diesen:

/usr/bin/ld: kann -lzlib nicht finden

Ich habe ein wenig gegoogelt und bin immer wieder auf verschiedene Probleme desselben Typs gestoßen, bei denen Leute sagten, Sie sollten sicherstellen, dass die .so-Datei tatsächlich existiert und wenn nicht, dann einen Symlink zur versionierten Datei erstellen, zum Beispiel zlib.so.1.2.8. Aber als ich überprüfte, dass zlib.so existierte, dachte ich, dass konnte nicht das Problem sein.

Ich stieß auf einen anderen Beitrag im Internet, der vorschlug, make mit LD_DEBUG=all auszuführen:

LD_DEBUG=all make

Obwohl ich eine MENGE Debug-Ausgaben bekam, war es tatsächlich nicht hilfreich. Es brachte mehr Verwirrung als etwas anderes. Also war ich kurz davor aufzugeben.

Dann hatte ich eine Erleuchtung. Ich dachte daran, den Hilfetext für den ld-Befehl tatsächlich zu überprüfen:

ld --help

Daraus erkannte ich, wie man ld im ausführlichen Modus ausführt (stellt euch das vor):

ld -lzlib --verbose

Dies ist die Ausgabe, die ich erhalten habe:

==================================================
Versuch, /usr/x86_64-linux-gnu/lib64/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /usr/x86_64-linux-gnu/lib64/libzlib.a zu öffnen, fehlgeschlagen
Versuch, /usr/local/lib64/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /usr/local/lib64/libzlib.a zu öffnen, fehlgeschlagen
Versuch, /lib64/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /lib64/libzlib.a zu öffnen, fehlgeschlagen
Versuch, /usr/lib64/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /usr/lib64/libzlib.a zu öffnen, fehlgeschlagen
Versuch, /usr/x86_64-linux-gnu/lib/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /usr/x86_64-linux-gnu/lib/libzlib.a zu öffnen, fehlgeschlagen
Versuch, /usr/local/lib/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /usr/local/lib/libzlib.a zu öffnen, fehlgeschlagen
Versuch, /lib/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /lib/libzlib.a zu öffnen, fehlgeschlagen
Versuch, /usr/lib/libzlib.so zu öffnen, fehlgeschlagen
Versuch, /usr/lib/libzlib.a zu öffnen, fehlgeschlagen
/usr/bin/ld.bfd.real: kann -lzlib nicht finden

Ding, ding, ding...

Also, um es endlich so zu beheben, dass ich MySQL mit meiner eigenen Version von ZLIB kompilieren konnte (anstatt der gebündelten Version):

sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so

Voilà!

247voto

Saurabh Bhola Punkte 2940

Wenn Ihr Bibliotheksname beispielsweise libxyz.so lautet und sich auf dem Pfad befindet:

/home/user/myDir

dann um es mit Ihrem Programm zu verknüpfen:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog

82voto

tripleee Punkte 155951

Es scheint keine Antwort zu geben, die das sehr verbreitete Anfängerproblem angeht, die erforderliche Bibliothek von Anfang an nicht installieren zu können.

Auf Debian-ähnlichen Plattformen kann, wenn libfoo fehlt, können Sie es häufig mit etwas wie folgt installieren:

apt-get install libfoo-dev

Die -dev Version des Pakets ist für Entwicklungsarbeiten erforderlich, sogar für banale Entwicklungsarbeiten wie das Kompilieren von Quellcode, um ihn mit der Bibliothek zu verknüpfen.

Der Paketname erfordert manchmal einige Dekorationen (libfoo0-dev? foo-dev ohne das lib Präfix? etc), oder Sie können einfach die Paket-Suche Ihres Betriebssystems verwenden, um genau herauszufinden, welche Pakete eine bestimmte Datei bereitstellen.

(Wenn es mehr als eins gibt, müssen Sie herausfinden, worin ihre Unterschiede bestehen. Das Auswählen des coolsten oder beliebtesten ist ein häufiger Shortcut, aber kein akzeptables Verfahren für ernsthafte Entwicklungsarbeiten.)

Für andere Architekturen (besonders RPM) gelten ähnliche Verfahren, obwohl die Details unterschiedlich sein können.

73voto

frogatto Punkte 27347

Kompilierzeit

Wenn g++ sagt kann -l nicht finden, bedeutet das, dass g++ nach der Datei lib{nameOfTheLibrary}.so gesucht hat, aber sie nicht im Shared-Library-Suchpfad gefunden hat, der standardmäßig auf /usr/lib und /usr/local/lib zeigt und möglicherweise woanders auch.

Um dieses Problem zu lösen, sollten Sie entweder die Bibliotheksdatei (lib{nameOfTheLibrary}.so) in diesen Suchpfaden bereitstellen oder die -L Befehlsoption verwenden. -L{path} sagt dem g++ (eigentlich ld), Bibliotheksdateien im Pfad {path} zusätzlich zu den Standardpfaden zu finden.

Beispiel: Angenommen, Sie haben eine Bibliothek unter /home/taylor/libswift.so und möchten Ihre App mit dieser Bibliothek verknüpfen. In diesem Fall sollten Sie dem g++ folgende Optionen bereitstellen:

g++ main.cpp -o main -L/home/taylor -lswift
  • Hinweis 1: Die -l Option erhält den Bibliotheksnamen ohne lib und .so am Anfang und Ende.

  • Hinweis 2: In einigen Fällen wird dem Bibliotheksnamen möglicherweise ihre Version folgen, zum Beispiel libswift.so.1.2. In diesen Fällen kann g++ die Bibliotheksdatei ebenfalls nicht finden. Ein einfacher Workaround zur Behebung dieses Problems besteht darin, ein symbolisches Link zu libswift.so.1.2 mit dem Namen libswift.so zu erstellen.


Ausführungszeit

Wenn Sie Ihre App mit einer Shared-Library verknüpfen, muss diese Bibliothek immer verfügbar sein, wenn Sie die App ausführen. Zur Laufzeit sucht Ihre App (eigentlich der dynamische Linker) nach ihren Bibliotheken in LD_LIBRARY_PATH. Es handelt sich um eine Umgebungsvariable, die eine Liste von Pfaden speichert.

Beispiel: Im Fall unseres Beispiels libswift.so kann der dynamische Linker libswift.so im LD_LIBRARY_PATH (das auf die standardmäßigen Suchpfade zeigt) nicht finden. Um das Problem zu beheben, sollten Sie diese Variable mit dem Pfad ergänzen, in dem sich libswift.so befindet.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor

44voto

Finn Årup Nielsen Punkte 5390

Während der Kompilierung mit g++ über make definieren Sie LIBRARY_PATH, wenn es nicht angemessen ist, die Makefile mit der Option -L zu ändern. Ich habe meine zusätzliche Bibliothek in /opt/lib platziert, also habe ich gemacht:

$ export LIBRARY_PATH=/opt/lib/

und dann habe ich make ausgeführt, um eine erfolgreiche Kompilierung und Verknüpfung zu erreichen.

Um das Programm mit einer Shared Library auszuführen, definieren Sie:

$ export LD_LIBRARY_PATH=/opt/lib/

bevor Sie das Programm ausführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X