LD_LIBRARY_PATH는 어디에 있습니까? LD_LIBRARY_PATH env 변수를 어떻게 설정합니까?


26

유닉스를 사용하여 C ++ 프로그램을 작성하려고합니다.

오류가 발생했습니다

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

LD_LIBRARY_PATH env 변수에서 libboost *의 위치를 ​​설정하고 원래 입력 한대로 make를 호출해야한다고 들었습니다.

-L /usr/lib64 -l boost_regex-mt

또는

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

그러나 LD_LIBRARY_PATH는 어디에 있습니까? LD_LIBRARY_PATH env 변수를 어떻게 설정합니까?


문제를 이해하는 데 유용한 컨텍스트를 제공하면서 왜 대부분의 질문을 편집 했습니까?
jlliagre

@jlliagre 나는 동의한다. 원래 질문에 의해 제공된 맥락이 없다면, 최고 투표 답변은 의미가 없습니다. 나는 그것을 롤백했다.
John1024

답변:


25

LD_LIBRARY_PATH env 변수를 어떻게 설정합니까?

이 작업을 수행했을 때 이미 설정했습니다.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

그러나 그렇게해도 문제가 해결되지는 않습니다. $LD_LIBRARY_PATH동적 링크 가능한 라이브러리를 검색 할 추가 디렉토리 목록을 제공하기 위해 실행시 참조됩니다. 링크 타임에는 참조되지 않습니다 (빌드 도구 자체에 필요한 라이브러리를 찾는 경우 제외).

빌드 타임에 라이브러리를 찾을 위치를 링커에 알리려면 -L링커 옵션 을 사용해야합니다 . 당신도 이미 그렇게했습니다 :

-L /usr/lib64

여전히 오류가 발생하면 라이브러리가 실제로 있는지 확인해야합니다. 파일이 libboost_regex-mt.so있거나 libboost_regex-mt.a해당 디렉토리 (또는 다른 디렉토리)에 있습니까? 이와 같은 파일 libboost_regex-mt.so.othersuffix은이 목적으로 계산되지 않습니다. 이것을 가지고 있지 않다면,이 라이브러리를위한 배포판 개발 패키지를 설치해야 할 것입니다.


리눅스에서, ld (1) 매뉴얼 페이지에 따라, $LD_LIBRARY_PATH또한에 의해 상담을 ld환경 변수 "LD_LIBRARY_PATH"의 내용을 검색, 기본 링커를 들어«5 :. »
vinc17

@csx-배포판은 무엇입니까? 우분투, 페도라, CentOS 등? 예를 들어 여기를 참조하십시오 : stackoverflow.com/questions/15874220/…
slm

@ vinc17, ld맨 페이지의 인용문은 재귀 적 종속성에만 관련되어 있습니다. 이미 링크되도록 선택된 라이브러리의 종속 라이브러리입니다. 빌드중인 실행 파일에 대한 라이브러리를 찾는 것은 중요하지 않습니다. 그게 뭐야 -L.
Celada

@csx Scientific Linux에 대해서는 아무것도 모르지만 apt-get명령을 찾을 수 없으면 Debian에서 파생되지 않으므로 누락 된 패키지를 설치하는 다른 방법이 필요합니다. 그것은 확실히 당신의 문제입니다.
Celada

늦었지만 : 링크 단계를 포함 할 때 또는 -Ldir -llib논쟁 단계로 작용해야 하지만 원래 및 복원 된 Q 언급 : 정상적인 makefile 과 영리한 makefile을 사용하면 영리한 makefile 작성자를 던지기 위해 벽돌을 포함하여 거의 모든 것이 필요할 수 있습니다. ldgcc/g++/etcmakeLDFLAGS="whatever"
dave_thompson_085

11

LD_LIBRARY_PATH에 새로운 경로를 영구적으로 추가하는 또 다른 방법 :

.conf에서 파일을 수정 하십시오 /etc/ld.so.conf.d/.

응용 프로그램을 설치 한 적이 있으며 다른 응용 프로그램에서 해당 라이브러리를 인식 할 수 없습니다. 그런 다음 경로 /usr/local/hdf5/libx86_64-linux-gnu.conf파일에 추가 합니다. 다음 줄에 넣으십시오. 구하다.

그런 다음 실행 sudo ldconfig

효과가있었습니다.

PS : OS 우분투 14.04


4

~/.profile쉘의 / 또는 특정 init 파일 에서 설정할 수 있습니다 (예 : ~/.bashrcbash, ~/.zshenvzsh). 그런 다음 쉘을 다시 시작해야합니다 (선택에 따라 로그 아웃했다가 다시 로그인하십시오).

다음을 통해 설정을 확인할 수 있습니다.

env | grep '^LD_LIBRARY_PATH'

편집 : LD_LIBRARY_PATH파일 이름이 일반적으로 이름에 포함 된 기계 코드가 포함 된 공유 라이브러리 용이며 .so다른 버전을 구별하기 위해 마침표로 구분 된 숫자가있을 수 있습니다. 에도 불구하고 LD_LIBRARY_PATHABI 불일치로 인해 라이브러리를 찾을 수 없습니다. 언어 (Perl 및 Python과 같은) 및 패키지에는 .so관련이없는 자체 라이브러리 시스템 ( 파일도 포함)이 있을 수 있습니다 LD_LIBRARY_PATH.


컴파일 된 프로그램은 여전히 ​​python 라이브러리를 찾지 못한다고 불평하지만 env | grep '^ LD_LIBRARY_PATH'. 무엇이 문제 일 수 있습니까?
Herman Toothrot

@HermanToothrot 내 답변을 업데이트했습니다. 파이썬에는 자체 라이브러리 시스템이 있습니다. 사용하지 않는 것 같습니다 LD_LIBRARY_PATH(일반 라이브러리와의 충돌을 피하기 위해). 오류 메시지와 함께 이에 대한 특정 질문을해야합니다.
vinc17

3

라이브러리 경로 오류가 링커에 있으면 컴파일하는 동안 라이브러리 경로를 변수 $ LD_LIBRARY_PATH에 추가해야합니다. 실제로 컴파일 된 프로그램을 실행할 때 라이브러리 오류가 발생하면 /etc/ld.so.conf에 라이브러리 경로를 추가하고 ldconfig를 실행하여 라이브러리 검색 경로 캐시를 다시 작성해야합니다.


이것은 훌륭하게 작동했습니다! 내 conf 파일은 /etc/ld.so.conf.d 디렉토리를 가리 키므로 libs 경로가있는 파일을 해당 폴더에 추가하십시오. 또한 ldconfig를 루트 (또는 sudo)로 실행하십시오.
RLaaa

0

로 해결 :

에 추가 /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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.