Ich versuche mein Programm zu kompilieren und es gibt diesen Fehler zurück:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
In meinem Makefile verwende ich den Befehl g++
und den Link zu meiner Bibliothek. Dies ist ein symbolischer Link zu meiner Bibliothek in einem anderen Verzeichnis.
Gibt es eine Option zum Hinzufügen, damit es funktioniert?
-l
Schalters mit lib <Name> beginnen muss (z. B. libpthread.so, mit dem Sie bereits verknüpfen).Antworten:
Wenn Ihr Bibliotheksname say lautet
libxyz.so
und er sich auf dem Pfad befindet, sagen Sie:dann, um es mit Ihrem Programm zu verknüpfen:
quelle
Um herauszufinden, wonach der Linker sucht, führen Sie ihn im ausführlichen Modus aus.
Dieses Problem ist beispielsweise beim Kompilieren von MySQL mit ZLIB-Unterstützung aufgetreten. Beim Kompilieren wurde folgende Fehlermeldung angezeigt:
Ich habe ein bisschen Googl'ing gemacht und bin immer wieder auf verschiedene Probleme der gleichen Art gestoßen, bei denen die Leute sagten, sie würden sicherstellen, dass die .so-Datei tatsächlich existiert. Wenn dies nicht der Fall ist, erstellen Sie einen Symlink zu der versionierten Datei, z. B. zlib. so.1.2.8. Aber als ich nachgesehen habe, war zlib.so DID vorhanden. Also, dachte ich, das könnte doch nicht das Problem sein.
Ich bin auf einen anderen Beitrag im Internet gestoßen, der vorschlug, make mit LD_DEBUG = all auszuführen:
Obwohl ich eine TONNE Debugging-Ausgabe habe, war es nicht wirklich hilfreich. Es fügte mehr Verwirrung als alles andere hinzu. Also wollte ich aufgeben.
Dann hatte ich eine Offenbarung. Ich dachte, ich sollte den Hilfetext für den Befehl ld überprüfen:
Daraus habe ich herausgefunden, wie man ld im ausführlichen Modus ausführt (stellen Sie sich das vor):
Dies ist die Ausgabe, die ich erhalten habe:
Ding Ding Ding...
Um es endlich zu beheben, damit ich MySQL mit meiner eigenen Version von ZLIB kompilieren kann (anstatt mit der mitgelieferten Version):
Voila!
quelle
-Xlinker --verbose
den Befehlszeilenargumenten von gcc hinzufügen , damit diese Option an ld übergeben wird.-Wl,-Bstatic
. Dies beschränkt die Suche nur auf .a-Dateien. Die ausführliche Option zeigte dies deutlich. Nach dem Entfernen-Wl,-Bstatic
wurden auch gemeinsam genutzte Bibliotheken durchsucht.-Wl,--verbose
und geht--verbose
an den Linker.-Wl,--verbose
, um den Linker ausführlich zu übergeben.Es scheint keine Antwort zu geben, die das sehr häufige Anfängerproblem behebt, die erforderliche Bibliothek überhaupt nicht zu installieren.
Wenn auf Debianish-Plattformen
libfoo
etwas fehlt, können Sie es häufig mit etwas wie installierenDie
-dev
Version des Pakets wird für Entwicklungsarbeiten benötigt, auch für triviale Entwicklungsarbeiten wie das Kompilieren von Quellcode zur Verknüpfung mit der Bibliothek.Der Paketname erfordert manchmal einige Dekorationen (
libfoo0-dev
?foo-dev
Ohne daslib
Präfix? Usw.), oder Sie können einfach Ihre Distributionen verwenden Paket suchen genau , um herauszufinden , welche Pakete eine bestimmte Datei zur Verfügung stellen.(Wenn es mehr als eine gibt, müssen Sie herausfinden, wo ihre Unterschiede liegen. Die Auswahl der coolsten oder beliebtesten ist eine häufige Abkürzung, aber kein akzeptables Verfahren für ernsthafte Entwicklungsarbeiten.)
Für andere Architekturen (insbesondere RPM) gelten ähnliche Verfahren, obwohl die Details unterschiedlich sind.
quelle
apt-get install libperl-dev
sortierte es für mich. Danke :)yum install openssl-devel
Lösung.Kompilierungszeit
Wenn g ++ sagt
cannot find -l<nameOfTheLibrary>
, bedeutet dies, dass g ++ nach der Datei gesuchtlib{nameOfTheLibrary}.so
hat, sie jedoch nicht im Suchpfad der gemeinsam genutzten Bibliothek gefunden hat, der standardmäßig auf/usr/lib
und/usr/local/lib
und woanders verweist .Um dieses Problem zu beheben, sollten Sie entweder die Bibliotheksdatei (
lib{nameOfTheLibrary}.so
) in diesen Suchpfaden angeben oder die-L
Befehlsoption verwenden.-L{path}
Weist das g ++ (tatsächlichld
) an,{path}
zusätzlich zu den Standardpfaden Bibliotheksdateien im Pfad 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 g ++ mit folgenden Optionen versorgen:Hinweis 1 : Mit der
-l
Option wird der Bibliotheksname ohnelib
und.so
am Anfang und Ende abgerufen.Hinweis 2 : In einigen Fällen folgt auf den Namen der Bibliotheksdatei beispielsweise die Version
libswift.so.1.2
. In diesen Fällen kann g ++ auch die Bibliotheksdatei nicht finden. Eine einfache Problemumgehung, um dies zu beheben, besteht darin, eine symbolische Verknüpfung zulibswift.so.1.2
aufgerufen zu erstellenlibswift.so
.Laufzeit
Wenn Sie Ihre App mit einer gemeinsam genutzten Bibliothek verknüpfen, muss die Bibliothek immer verfügbar sein, wenn Sie die App ausführen. Zur Laufzeit sucht Ihre App (eigentlich dynamischer Linker) nach ihren Bibliotheken in
LD_LIBRARY_PATH
. Es ist eine Umgebungsvariable, die eine Liste von Pfaden speichert.Beispiel: Bei unserem
libswift.so
Beispiel kann dynamische Linker nicht findenlibswift.so
inLD_LIBRARY_PATH
(der auf Standard - Suchpfade). Um das Problem zu beheben, sollten Sie diese Variable an den Pfad anhängen, in dem sie sichlibswift.so
befindet.quelle
.so
Dateien kopiert habe/usr/lib
, aber es wurde für mich interessant, obexport
es helfen wird. Trotzmake
längerer Installation trat ein weiterer Fehler auf. Dieses Mal wurde die.so.0
Datei nicht gefunden, aber beide.so
und die.so.0
Datei befanden sich in dem Verzeichnis, in dem ich ein abhängiges Paket aus dem Quellcode erstellt habe. Könnten Sie dabei helfen?Während der Kompilierung mit
g++
viamake
definieren,LIBRARY_PATH
ob es möglicherweise nicht angebracht ist, das Makefile mit der-L
Option zu ändern . Ich hatte meine zusätzliche Bibliothek eingerichtet,/opt/lib
also tat ich:und lief dann
make
für eine erfolgreiche Kompilierung und Verknüpfung.Um das Programm mit einer gemeinsam genutzten Bibliothek auszuführen, definieren Sie:
vor dem Ausführen des Programms.
quelle
Zunächst müssen Sie die Namensregel kennen von
lxxx
:lc
bedeutetlibc.so
,lltdl
bedeutetlibltdl.so
,lXtst
bedeutetlibXts.so
.Es ist also
lib
+lib-name
+.so
Sobald wir den Namen kennen, können wir
locate
den Pfad dieserlxxx.so
Datei finden.Wenn Sie es nicht finden können, müssen Sie es mit installieren
yum
(ich verwende CentOS). Normalerweise haben Sie diese Datei, aber sie ist nicht mit der richtigen Stelle verknüpft.Verknüpfe es mit dem richtigen Ort, normalerweise ist es
/lib64
oder/usr/lib64
$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/
Erledigt!
ref: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
quelle
locate
Funktioniert nur, wenn es regelmäßig installiert ist und ausgeführt wird. Eine grobe Problemumgehung besteht darin,find
auf Ihrer gesamten Festplatte ausgeführt zu werden, aber es wird natürlich einige Zeit dauern. Wenn Sie dies häufig tun, sollten Sie eine Installationlocate
in Betracht ziehen, um die (interaktiven, menschlichen) Kosten dieses Vorgangs zu senken.Wenn Sie Ihr Programm kompilieren, müssen Sie den Pfad zur Bibliothek angeben. Verwenden Sie in g ++ die Option -L:
quelle
ccmake
damit dieMakefile
mit dem verknüpften Flag erstellt wird? Ich möchte meine-lARToolkitPlus
Flagge mit einem Pfad verknüpfen .Dieser Fehler kann auch auftreten, wenn sich die symbolische Verknüpfung zu einer dynamischen Bibliothek befindet, aber aus älteren Gründen
-static
unter den Verknüpfungsflags angezeigt wird . Wenn ja, entfernen Sie es.quelle
Überprüfen Sie den Speicherort Ihrer Bibliothek, z. B. lxxx.so:
Wenn es sich nicht im
/usr/lib
Ordner befindet, geben Sie Folgendes ein:Erledigt.
quelle
Abgesehen von den bereits gegebenen Antworten kann es auch vorkommen, dass die Datei * .so vorhanden ist, aber nicht richtig benannt ist. Oder es kann vorkommen, dass die Datei * .so vorhanden ist, aber einem anderen Benutzer / Root gehört.
Problem 1: Falscher Name
Wenn Sie die Datei wie
-l<nameOfLibrary>
folgt verknüpfen, MUSS der Name der Bibliotheksdatei die Form haben.lib<nameOfLibrary>
Wenn Sie nur eine<nameOfLibrary>.so
Datei haben, benennen Sie diese um!Ausgabe 2: Falscher Besitzer
Um zu überprüfen, ob dies nicht das Problem ist, gehen Sie wie folgt vor
Wenn die Datei Root oder einem anderen Benutzer gehört, müssen Sie dies tun
quelle
Die Bibliothek, mit der ich eine Verknüpfung herstellen wollte, hatte einen nicht standardmäßigen Namen (dh es wurde kein 'lib' vorangestellt). Daher wurde empfohlen, einen solchen Befehl zum Kompilieren zu verwenden.
gcc test.c -Iinclude lib/cspice.a -lm
quelle
Hier sind Ubuntu-Informationen zu meinem Laptop.
Ich benutze find, um die .so-Dateien für boost_filesystem und boost_system zu finden
Verknüpfen Sie dann .so-Dateien mit / usr / lib und benennen Sie sie in .so um
Erledigt! R-Paket velocyto.R wurde erfolgreich installiert!
quelle
Ich habe die gleiche Fehlermeldung festgestellt.
Ich habe das
cmocka
als erstelltso
und versucht, es mit meiner ausführbaren Datei zu verknüpfen. Aberld
beschwert sich immer unten:Es stellt sich heraus, dass nach dem Erstellen 3 Dateien generiert
cmocka
wurden:1 und 2 sind Symbolverknüpfungen und nur 3 ist die echte Datei.
Ich habe nur die 1 in meinen Bibliotheksordner kopiert, wo ich
ld
die 3 nicht finden konnte.Nachdem ich alle 3 kopiert habe,
ld
funktioniert.quelle