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?


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.


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


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.