Ścieżka biblioteki LD vs ścieżka biblioteki
Buduję prosty program C++ i chcę tymczasowo zastąpić dostarczoną przez system bibliotekę współdzieloną nowszą jej wersją, do rozwoju i testowania.
Próbowałem ustawić zmienną LD_LIBRARY_PATH, ale linker (ld) nie powiódł się z:
/ usr / bin/ ld: cannot find-lyaml-cpp
Spodziewałem się, że to zadziała, ponieważ według strony podręcznika LD:
Linker używa następującego wyszukiwania ścieżki do zlokalizowania wymaganych współdzielonych biblioteki: ... Dla native linkera, zawartość zmiennej środowiskowej "LD_LIBRARY_PATH"...
Potem próbowałem ustawić LIBRARY_PATH i to zadziałało.
Zgodnie z instrukcją GCC:
Wartość LIBRARY_PATH jest listą rozdzieloną dwukropkami katalogów, podobnie jak PATH. Kiedy skonfigurowany jako natywny kompilator, GCC próbuje katalogów podanych w ten sposób podczas wyszukiwania specjalnego linkera plików, jeśli nie może ich znaleźć za pomocą GCC_EXEC_PREFIX. Łączenie za pomocą GCC używa również tych katalogów, gdy wyszukiwanie zwykłych bibliotek dla opcja-l (ale katalogi podane za pomocą-l come first).
Jak sugeruje Instrukcja (GCC), LIBRARY_PATH działa, ponieważ łączę się z GCC.
Ale..
- skoro Łączę z gcc dlaczego ld jest wywołanie, jako komunikat o błędzie sugeruje?
- jaki jest sens posiadanie dwóch zmiennych obsługujących to samo cel? Czy są jakieś inne różnice?
3 answers
LIBRARY_PATH
jest używany przez gcc przed kompilacją do przeszukiwania katalogów zawierających Statyczne biblioteki, które muszą być połączone z Twoim programem.
LD_LIBRARY_PATH
jest używany przez program do przeszukiwania katalogów zawierających biblioteki shared Po pomyślnym skompilowaniu i połączeniu.
Edytuj:
Jak wskazano poniżej, twoje biblioteki mogą być statyczne lub współdzielone. Jeśli jest Statyczny, to kod jest kopiowany do twojego programu i nie musisz szukać biblioteki po twoim program jest kompilowany i linkowany. Jeśli twoja Biblioteka jest współdzielona, musi być dynamicznie połączona z Twoim programem i wtedy LD_LIBRARY_PATH
wchodzi w grę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 21:08:26
LD_LIBRARY_PATH
jest wyszukiwany po uruchomieniu programu, {[1] } jest wyszukiwany w czasie połączenia.
Zastrzeżenie z komentarze :
- podczas łączenia bibliotek z
ld
(zamiastgcc
lubg++
), Zmienne środowiskoweLIBRARY_PATH
lubLD_LIBRARY_PATH
nie są odczytywane. - podczas łączenia bibliotek z
gcc
lubg++
, odczytywana jest zmienna środowiskowaLIBRARY_PATH
(Zobacz dokumentacja "gcc
używa tych katalogów podczas wyszukiwania zwykłych bibliotek").
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 15:09:53
Ponieważ łącze z gcc dlaczego LD jest wywoływany, jak sugeruje komunikat o błędzie?
Gcc wywołuje LD wewnętrznie, gdy jest w trybie łączenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 00:36:44