Ich kompiliere ein C ++ - Programm mit g++
und ld
. Ich habe eine .so
Bibliothek, die ich beim Verknüpfen verwenden möchte. Es besteht jedoch eine Bibliothek mit dem gleichen Namen in /usr/local/lib
, und ld
ist die Wahl , dass die Bibliothek über das, was ich direkt spezifizieren bin. Wie kann ich das beheben?
Für die folgenden Beispiele ist meine Bibliotheksdatei /my/dir/libfoo.so.0
. Dinge, die ich ausprobiert habe und die nicht funktionieren:
- Mein g ++ Befehl ist
g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp
- Hinzufügen
/my/dir
zum Anfang oder Ende meiner$PATH
en`-Variablen - Hinzufügen
/my/dir/libfoo.so.0
als Argument zu g ++
libfoo.*
Dateien vorhanden sind und wo -.so
w / o.0
,.a
etc etc?Antworten:
Fügen Sie den Pfad zu Ihrer neuen Bibliothek hinzu
LD_LIBRARY_PATH
(auf dem Mac hat sie einen etwas anderen Namen ...)Ihre Lösung sollte mit den
-L/my/dir -lfoo
Optionen arbeiten. Verwenden Sie zur Laufzeit LD_LIBRARY_PATH, um auf den Speicherort Ihrer Bibliothek zu verweisen.Vorsicht bei der Verwendung von LD_LIBRARY_PATH - kurz (vom Link):
ODER
Verwenden Sie die Option rpath über gcc, um den Suchpfad für die Linker-Laufzeitbibliothek zu verknüpfen, anstatt im Standardverzeichnis zu suchen (Option gcc):
Dies ist gut für eine vorübergehende Lösung. Linker durchsucht zuerst LD_LIBRARY_PATH nach Bibliotheken, bevor er in Standardverzeichnisse schaut.
Wenn Sie LD_LIBRARY_PATH nicht dauerhaft aktualisieren möchten, können Sie dies im laufenden Betrieb über die Befehlszeile tun:
Sie können überprüfen, was Bibliothekslinker über die Verwendung wissen (Beispiel):
Und Sie können überprüfen, welche Bibliothek Ihre Anwendung verwendet:
quelle
LD_LIBRARY_PATH
wird zur Laufzeit gesucht, zur Kompilierungszeit, die Sie festlegen möchtenLIBRARY_PATH
. Siehe gcc.gnu.org/onlinedocs/gcc/Environment-Variables.htmlgcc myFile.c -o myFile.o -l myLibraryBaseName -Wl,-rpath,locationOfMyLibrary -L locationOfMyLibrary
Dies ist eine alte Frage, aber niemand scheint dies erwähnt zu haben.
Sie hatten Glück, dass das Ding überhaupt verknüpft war.
Du musstest dich ändern
dazu:
Ihr Linker verfolgt die Symbole, die aufgelöst werden müssen. Wenn die Bibliothek zuerst gelesen wird, sind keine Symbole erforderlich, daher werden die darin enthaltenen Symbole ignoriert. Geben Sie die Bibliotheken nach den Dingen an, die mit ihnen verknüpft werden müssen, damit Ihr Linker Symbole enthält.
Außerdem
-lfoo
wird speziell nach einer Datei mit dem Namenlibfoo.a
oderlibfoo.so
nach Bedarf gesucht . Nichtlibfoo.so.0
. Also entwederln
den Namen oder die Bibliothek als entsprechend umbenennen.So zitieren Sie die gcc-Manpage:
Das direkte Hinzufügen der Datei zur
g++
Befehlszeile sollte funktionieren, es sei denn, Sie haben sie vorher angegebenbar.cpp
, sodass der Linker sie ignoriert, weil keine erforderlichen Symbole vorhanden sind, da noch keine Symbole benötigt wurden.quelle
Die Angabe des absoluten Pfads zur Bibliothek sollte einwandfrei funktionieren:
Haben Sie daran gedacht, den zu entfernen,
-lfoo
nachdem Sie den absoluten Pfad hinzugefügt haben?quelle
@
versionierte Symbole? Minimales Beispiel: github.com/cirosantilli/cpp-cheat/blob/…Alternativ können Sie die Umgebungsvariablen
LIBRARY_PATH
und verwendenCPLUS_INCLUDE_PATH
, die jeweils angeben, wo nach Bibliotheken und wo nach Headern gesucht werden soll (CPATH
erledigt auch die Arbeit), ohne die Optionen -L und -I anzugeben.Bearbeiten:
CPATH
Enthält einen Header mit-I
undCPLUS_INCLUDE_PATH
mit-isystem
.quelle
export LIBRARY_PATH = /path/to/lib
in der gleichen Konsolensitzung, in der Sie kompilierenWenn man mit DLL in Windows arbeitet und .so-Versionsnummern in Linux / QT überspringen möchte, werden durch Hinzufügen
CONFIG += plugin
Versionsnummern entfernt. Wie Herr Klatchko erwähnte, funktioniert es gut, den absoluten Pfad zu .so zu verwenden und ihn dem Linker zu geben.quelle