Dodaj ścieżkę do miejsca, w którym znajduje się twoja nowa biblioteka LD_LIBRARY_PATH
(ma nieco inną nazwę na Macu ...)
Twoje rozwiązanie powinno działać z wykorzystaniem -L/my/dir -lfoo
opcji, w czasie wykonywania użyj LD_LIBRARY_PATH, aby wskazać lokalizację biblioteki.
Ostrożnie z użyciem LD_LIBRARY_PATH - w skrócie (z linku):
..implikacje ..:
Bezpieczeństwo : Pamiętasz, że katalogi określone w LD_LIBRARY_PATH są przeszukiwane przed (!) standardowymi lokalizacjami? W ten sposób nieprzyjemna osoba może spowodować, że aplikacja załaduje wersję biblioteki współdzielonej, która zawiera złośliwy kod! To jeden z powodów, dla których pliki wykonywalne setuid / setgid zaniedbują tę zmienną!
Występ: Program ładujący dowiązania musi przeszukać wszystkie określone katalogi, aż znajdzie katalog, w którym znajduje się biblioteka współdzielona - dla WSZYSTKICH bibliotek współdzielonych, z którymi aplikacja jest połączona! Oznacza to wiele wywołań systemowych open (), które zakończą się niepowodzeniem z komunikatem „ENOENT (Brak takiego pliku lub katalogu)”! Jeśli ścieżka zawiera wiele katalogów, liczba nieudanych wywołań będzie rosła liniowo i można to rozpoznać po uruchomieniu aplikacji. Jeśli niektóre (lub wszystkie) katalogi znajdują się w środowisku NFS, czas uruchamiania aplikacji może być naprawdę długi - i może spowolnić cały system!
Niezgodność: To jest najczęstszy problem. LD_LIBRARY_PATH wymusza na aplikacji załadowanie biblioteki współdzielonej, z którą nie jest połączona, a to prawdopodobnie nie jest zgodne z wersją oryginalną. Może to być bardzo oczywiste, np. Awaria aplikacji, lub może prowadzić do błędnych wyników, jeśli wybrana biblioteka nie do końca robi to, co zrobiłaby wersja oryginalna. Szczególnie to drugie jest czasami trudne do debugowania.
LUB
Użyj opcji rpath przez gcc do konsolidatora - ścieżka przeszukiwania biblioteki uruchomieniowej zostanie użyta zamiast szukać w standardowym katalogu (opcja gcc):
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
Jest to dobre rozwiązanie tymczasowe. Linker najpierw przeszukuje LD_LIBRARY_PATH w poszukiwaniu bibliotek, zanim zajrzy do standardowych katalogów.
Jeśli nie chcesz trwale aktualizować LD_LIBRARY_PATH, możesz to zrobić w locie z wiersza poleceń:
LD_LIBRARY_PATH=/some/custom/dir ./fooo
Możesz sprawdzić, o czym konsolidator bibliotek wie (przykład):
/sbin/ldconfig -p | grep libpthread
libpthread.so.0 (libc6, OS ABI: Linux 2.6.4) => /lib/libpthread.so.0
Możesz też sprawdzić, której biblioteki używa Twoja aplikacja:
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.*
istnieją pliki i gdzie -.so
w / o.0
,.a
itp itd?