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?
Odpowiedzi:
Już to ustawiłeś, gdy to zrobiłeś:
Ale to nie rozwiąże twojego problemu.
$LD_LIBRARY_PATH
w 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ć
-L
opcji linkera. Ty też to zrobiłeś:Jeśli nadal pojawia się błąd, musisz upewnić się, że biblioteka rzeczywiście tam jest. Czy masz plik
libboost_regex-mt.so
lublibboost_regex-mt.a
w tym (lub innym) katalogu? Pamiętaj, że plik podobnylibboost_regex-mt.so.othersuffix
do tego nie ma znaczenia. Jeśli tego nie masz, prawdopodobnie musisz zainstalować pakiet programistyczny dystrybucji dla tej biblioteki.źródło
$LD_LIBRARY_PATH
konsultują się równieżld
: «5. W przypadku natywnego linkera wyszukaj zawartość zmiennej środowiskowej" LD_LIBRARY_PATH ". »ld
podrę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-L
robi.apt-get
daje 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.-Ldir -llib
powinien działać jako argumenty dold
lub wgcc/g++/etc
przypadku uwzględnienia fazy łącza, ale oryginalne i przywrócone Q wspominamake
: 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.Innym sposobem na trwałe dodanie nowej ścieżki w LD_LIBRARY_PATH:
Edytuj
.conf
plik 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/lib
Dox86_64-linux-gnu.conf
pliku. Po prostu wstaw w następnym wierszu. Zapisać.Następnie uruchomić
sudo ldconfig
Zadziałało.
PS: OS Ubuntu 14.04
źródło
Możesz ustawić go w swoim
~/.profile
i / lub określonym pliku init powłoki (np.~/.bashrc
Dla bash,~/.zshenv
dla 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ą:
EDYCJA:
LD_LIBRARY_PATH
jest dla bibliotek współdzielonych, które zawierają kod maszynowy, których nazwy zwykle zawierają.so
w nazwie, ewentualnie poprzedzone liczbami oddzielonymi kropkami w celu rozróżnienia różnych wersji. Możliwe jest, że mimoLD_LIBRARY_PATH
to 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.so
plikami), niezwiązany zLD_LIBRARY_PATH
.źródło
LD_LIBRARY_PATH
(aby uniknąć kolizji ze zwykłymi bibliotekami). Musisz zadać w tym celu konkretne pytanie z wyświetlonym komunikatem o błędzie.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.
źródło
Rozwiązany z:
dodaj do
/etc/systemd/system/pm2-node.service
źródło