Tworzę prosty program w C ++ i chcę tymczasowo zastąpić udostępnianą przez system bibliotekę współdzieloną jej nowszą wersją, na potrzeby programowania i testowania.
Próbowałem ustawić zmienną LD_LIBRARY_PATH, ale linker (ld) nie powiódł się z:
/ usr / bin / ld: nie można znaleźć -lyaml-cpp
Spodziewałem się, że to zadziała, ponieważ zgodnie ze stroną podręcznika ld:
Konsolidator używa następujących ścieżek wyszukiwania do zlokalizowania wymaganych bibliotek współdzielonych: ... W przypadku konsolidatora natywnego zawartość zmiennej środowiskowej „LD_LIBRARY_PATH” ...
Następnie spróbowałem ustawić LIBRARY_PATH i zadziałało.
Zgodnie z instrukcją GCC:
Wartość LIBRARY_PATH to rozdzielona dwukropkami lista katalogów, podobnie jak PATH. Po skonfigurowaniu jako natywny kompilator, GCC próbuje katalogów określonych w ten sposób podczas wyszukiwania specjalnych plików konsolidatora, jeśli nie może ich znaleźć za pomocą GCC_EXEC_PREFIX. Łączenie za pomocą GCC również używa tych katalogów podczas wyszukiwania zwykłych bibliotek dla opcji -l (ale katalogi określone przez -L są pierwsze).
Jak sugeruje podręcznik (GCC), LIBRARY_PATH działa, ponieważ łączę się z GCC.
Ale..
- Skoro łączę się z gcc, dlaczego jest wywoływane ld, jak sugeruje komunikat o błędzie?
- Jaki jest sens posiadania dwóch zmiennych w tym samym celu? Czy są jakieś inne różnice?
LIBRARY_PATH
jest używany do wyszukiwania katalogów zawierających biblioteki statyczne ORAZ dynamiczne, a nie tylko biblioteki statyczne.LIBRARY_PATH
jest wyszukiwane biblioteki (statyczne lub dynamiczne) w czasie kompilacji, a w czasie wykonywaniaLD_LIBRARY_PATH
- biblioteki dynamiczne. Oczywiście w czasie wykonywania nie musisz szukać bibliotek statycznych.LD_LIBRARY_PATH
jest przeszukiwany podczas uruchamiania programu,LIBRARY_PATH
przeszukiwany w czasie łączenia.zastrzeżenie od komentarzy :
ld
(zamiastgcc
lubg++
) zmienne środowiskoweLIBRARY_PATH
lubLD_LIBRARY_PATH
nie są odczytywane.gcc
lubg++
,LIBRARY_PATH
odczytywana jest zmienna środowiskowa (patrz dokumentacja „gcc
używa tych katalogów podczas wyszukiwania zwykłych bibliotek” ).źródło
ld
sama w sobie nie szukać w bibliotekach alboLIBRARY_PATH
alboLD_LIBRARY_PATH
. Dopiero gdygcc
wywołujeld
,LIBRARY_PATH
staje się używane. (Nauczyłem się tego nagcc wywołuje wewnętrznie ld, gdy jest w trybie łączenia.
źródło