gdzie jest LD_LIBRARY_PATH? jak ustawić zmienną env LD_LIBRARY_PATH?

26

Próbuję zbudować program c ++ przy użyciu Uniksa.

Dostałem błąd

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

Słyszałem, że po prostu muszę ustawić lokalizację libboost * w mojej zmiennej env LD_LIBRARY_PATH, a następnie wywołać make tak jak pierwotnie, wpisując

-L /usr/lib64 -l boost_regex-mt

lub

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Ale gdzie jest LD_LIBRARY_PATH? jak ustawić zmienną env LD_LIBRARY_PATH?

csx
źródło
Dlaczego zredagowałeś większość swojego pytania, gdy było to przydatne w zrozumieniu twojego problemu?
jlliagre
@jlliagre Zgadzam się: bez kontekstu podanego w pierwotnym pytaniu odpowiedź, na którą głosowano, nie ma sensu. Zwróciłem to.
John1024,

Odpowiedzi:

25

jak ustawić zmienną env LD_LIBRARY_PATH?

Już to ustawiłeś, gdy to zrobiłeś:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Ale to nie rozwiąże twojego problemu. $LD_LIBRARY_PATHw momencie wykonywania jest konsultowany w celu zapewnienia listy dodatkowych katalogów, w których można wyszukiwać dynamicznie dające się połączyć biblioteki. Nie jest konsultowany w czasie linku (może z wyjątkiem lokalizacji bibliotek wymaganych przez same wbudowane narzędzia!).

Aby powiedzieć linkerowi, gdzie znaleźć biblioteki w czasie kompilacji, musisz użyć -Lopcji linkera. Ty też to zrobiłeś:

-L /usr/lib64

Jeśli nadal pojawia się błąd, musisz upewnić się, że biblioteka rzeczywiście tam jest. Czy masz plik libboost_regex-mt.solub libboost_regex-mt.aw tym (lub innym) katalogu? Pamiętaj, że plik podobny libboost_regex-mt.so.othersuffixdo tego nie ma znaczenia. Jeśli tego nie masz, prawdopodobnie musisz zainstalować pakiet programistyczny dystrybucji dla tej biblioteki.

Celada
źródło
W Linuksie, zgodnie ze stroną podręcznika ld (1), $LD_LIBRARY_PATHkonsultują się również ld: «5. W przypadku natywnego linkera wyszukaj zawartość zmiennej środowiskowej" LD_LIBRARY_PATH ". »
vinc17
@csx - jaka jest twoja dystrybucja? Ubuntu, Fedora, CentOS itp.? Zobacz tutaj, na przykład: stackoverflow.com/questions/15874220/…
slm
@ vinc17, Ten cytat ze strony ldpodręcznika dotyczy tylko zależności rekurencyjnych: zależne biblioteki biblioteki, która została już wybrana do połączenia. Nie dotyczy znalezienia bibliotek dla budowanego pliku wykonywalnego. Właśnie to -Lrobi.
Celada,
@csx Nie wiem nic o naukowym linuksie, ale jeśli apt-getdaje polecenie, że nie znaleziono, to nie pochodzi z Debiana, więc potrzebujesz innej metody, aby zainstalować brakujący pakiet. To zdecydowanie jest twój problem.
Celada,
Późno, ale: -Ldir -llibpowinien działać jako argumenty do ldlub w gcc/g++/etcprzypadku uwzględnienia fazy łącza, ale oryginalne i przywrócone Q wspomina make: przy normalnym makefile prawdopodobnie potrzebujesz, LDFLAGS="whatever"a przy sprytnym makefile możesz potrzebować prawie wszystkiego, w tym cegieł, aby rzucić na sprytnego autora makefile.
dave_thompson_085
11

Innym sposobem na trwałe dodanie nowej ścieżki w LD_LIBRARY_PATH:

Edytuj .confplik w /etc/ld.so.conf.d/.

Zawsze instalowałem aplikację, a jej biblioteki nie mogły zostać rozpoznane przez inną aplikację. Następnie dodaję ścieżkę, tj. /usr/local/hdf5/libDo x86_64-linux-gnu.confpliku. Po prostu wstaw w następnym wierszu. Zapisać.

Następnie uruchomić sudo ldconfig

Zadziałało.

PS: OS Ubuntu 14.04

iparjono
źródło
4

Możesz ustawić go w swoim ~/.profilei / lub określonym pliku init powłoki (np. ~/.bashrcDla bash, ~/.zshenvdla zsh). Następnie musisz zrestartować powłokę (i ewentualnie wylogować się i zalogować ponownie, w zależności od wyboru).

Możesz sprawdzić swoje ustawienia za pomocą:

env | grep '^LD_LIBRARY_PATH'

EDYCJA: LD_LIBRARY_PATHjest dla bibliotek współdzielonych, które zawierają kod maszynowy, których nazwy zwykle zawierają .sow nazwie, ewentualnie poprzedzone liczbami oddzielonymi kropkami w celu rozróżnienia różnych wersji. Możliwe jest, że mimo LD_LIBRARY_PATHto biblioteka nie zostanie znaleziona z powodu niedopasowania ABI. Zauważ też, że języki (jak Perl i Python) i pakiety mogą mieć swój własny system bibliotek (być może również z .soplikami), niezwiązany z LD_LIBRARY_PATH.

vinc17
źródło
Mój skompilowany program wciąż narzeka, że ​​nie znalazł biblioteki Pythona, chociaż widzę poprawną ścieżkę za pomocą env | grep „^ LD_LIBRARY_PATH”. Co może być problemem?
Herman Toothrot
@HermanToothrot Zaktualizowałem swoją odpowiedź. Zauważ, że python ma swój własny system bibliotek. Podejrzewam, że nie używa LD_LIBRARY_PATH(aby uniknąć kolizji ze zwykłymi bibliotekami). Musisz zadać w tym celu konkretne pytanie z wyświetlonym komunikatem o błędzie.
vinc17
3

Jeśli błąd ścieżki do biblioteki występuje w konsolidatorze, podczas kompilacji należy dodać ścieżkę do biblioteki do zmiennej $ LD_LIBRARY_PATH. Jeśli błąd biblioteki występuje podczas faktycznego uruchamiania skompilowanego programu, musisz dodać ścieżkę biblioteki do pliku /etc/ld.so.conf i uruchomić program ldconfig, aby odbudować pamięć podręczną ścieżki wyszukiwania bibliotek.

Gary
źródło
to działało świetnie! Mój plik conf wskazuje na ten katalog /etc/ld.so.conf.d, więc po prostu dodaj plik ze ścieżką libs do tego folderu. również upewnij się, że uruchomiłeś ldconfig jako root (lub sudo it)
RLaaa
0

Rozwiązany z:

dodaj do /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
Dave
źródło