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):
..implikationen ..:
Sicherheit : Denken Sie daran, dass die in LD_LIBRARY_PATH angegebenen Verzeichnisse vor (!) den Standardspeicherorten durchsucht werden? Auf diese Weise könnte eine böse Person Ihre Anwendung dazu bringen, eine Version einer gemeinsam genutzten Bibliothek zu laden, die schädlichen Code enthält! Dies ist ein Grund, warum ausführbare Dateien von setuid / setgid diese Variable vernachlässigen!
Performance: Der Linkloader muss alle angegebenen Verzeichnisse durchsuchen, bis er das Verzeichnis findet, in dem sich die gemeinsam genutzte Bibliothek befindet - für ALLE gemeinsam genutzten Bibliotheken ist die Anwendung verknüpft! Dies bedeutet viele Systemaufrufe von open (), die mit "ENOENT (keine solche Datei oder kein solches Verzeichnis)" fehlschlagen! Wenn der Pfad viele Verzeichnisse enthält, steigt die Anzahl der fehlgeschlagenen Aufrufe linear an. Dies können Sie an der Startzeit der Anwendung ablesen. Wenn sich einige (oder alle) Verzeichnisse in einer NFS-Umgebung befinden, kann die Startzeit Ihrer Anwendungen sehr lang werden - und das gesamte System verlangsamen!
Inkonsistenz: Dies ist das häufigste Problem. LD_LIBRARY_PATH zwingt eine Anwendung, eine gemeinsam genutzte Bibliothek zu laden, mit der sie nicht verknüpft war, und das ist höchstwahrscheinlich nicht mit der Originalversion kompatibel. Dies kann entweder sehr offensichtlich sein, dh die Anwendung stürzt ab, oder es kann zu falschen Ergebnissen führen, wenn die aufgenommene Bibliothek nicht ganz das tut, was die Originalversion getan hätte. Besonders letzteres ist manchmal schwer zu debuggen.
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):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
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:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
Sie können überprüfen, was Bibliothekslinker über die Verwendung wissen (Beispiel):
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
Und Sie können überprüfen, welche Bibliothek Ihre Anwendung verwendet:
ldd foo
linux-gate.so.1 => (0xffffe000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7f9e000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7e6e000)
librt.so.1 => /lib/librt.so.1 (0xb7e65000)
libm.so.6 => /lib/libm.so.6 (0xb7d5b000)
libc.so.6 => /lib/libc.so.6 (0xb7c2e000)
/lib/ld-linux.so.2 (0xb7fc7000)
libdl.so.2 => /lib/libdl.so.2 (0xb7c2a000)
libz.so.1 => /lib/libz.so.1 (0xb7c18000)
libfoo.*
Dateien vorhanden sind und wo -.so
w / o.0
,.a
etc etc?