라이브러리가 경로에 있는지 확인


15

라이브러리가 프로그램에 의해 설치되고 사용 가능한지 테스트하고 싶다고 가정합니다. ldconfig -p | grep mylib시스템에 설치되어 있는지 확인할 수 있습니다 . 그러나 라이브러리가 설정을 통해서만 알려지면 어떻게 LD_LIBRARY_PATH될까요?

이 경우 프로그램에서 라이브러리를 찾을 수 있지만 찾지 못할 수 있습니다 ldconfig. 라이브러리가 결합 된 링커 경로 에 있는지 어떻게 확인할 수 있습니까?

실제로 실제로 프로그램을 가지고 있지 않은 경우에도 작동하는 솔루션을 찾고 있다고 덧붙일 것입니다 (예 : 프로그램이 아직 컴파일되지 않은 경우), 특정 라이브러리가 ld' 경로.


2
ldd <binary>연결된 모든 라이브러리가 경로에 있는지 확인 하는 데 사용할 수 있습니다 . 더 우아한 방법이있을 수 있습니다.
토마스

@Thomas 나는 당신이 당신의 의견에 대답해야한다고 생각합니다. ldd이 목적을 정확히 수행합니다.
lgeorget

1
@Thomas-그러나 프로그램이 아직 컴파일되지 않았고 해당 라이브러리가 컴파일에 필요한 경우 어떻게해야합니까?
nbubis

@Igeorget-내 편집 / 댓글 참조
nbubis

@nbubis : 컴파일을 위해 라이브러리가 필요할 때 일반적으로 컴파일러에서 LIBRARY_PATH찾는 환경 변수 를 사용해야 합니다 gcc. LIBRARY_PATH환경 변수는 디렉토리의 콜론 구분 목록이 있습니다.
Thomas

답변:


15

ldconfig 액세스 할 수있는 모든 라이브러리를 나열 할 수 있습니다. 이 라이브러리는 캐시에도 저장됩니다.

/sbin/ldconfig -v -N캐시를 재구성하지 않고 모든 일반적인 라이브러리 경로를 크롤링하고 사용 가능한 모든 라이브러리를 나열합니다 (루트가 아닌 사용자는 불가능합니다). LD_LIBRARY_PATH의 라이브러리를 고려하지는 않지만 (이 게시물이 편집하기 전에 말한 것과는 달리) 아래 행을 사용하여 추가 라이브러리를 명령 행에 전달할 수 있습니다.

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfig는 1990 년대에 포기 된 1980 년대 도구입니다. 따라서 1987 년부터 ldconfigSunOS-4.0 a.out기반 동적 링커를 기반으로하는 구현에만 적용
되므로 이식성이 떨어집니다

LD_LIBRARY_PATH에만있는 라이브러리를 나열하는 데 어떻게 도움이됩니까? 나는 그것을 구문 분석하고 ldconfig를 통해 그것을 읽을 수있는 스크립트를 작성할 수는 있지만 오버 킬과 비슷한 것 같습니다.
nbubis

1
@nbubis는 항상 LD_LIBRARY_PATH의 라이브러리를 ldconfig로 전달할 수 있습니다. /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)내 취향에 너무 과도하지 않은 것처럼 .
lgeorget

@schily 정말요? 내가 알 수있는 한 ELF 라이브러리와 꽤 잘 작동합니다. 그리고 ld.so는 여전히 사용되며 ldconfig에서 빌드 한 캐시에 의존합니다.
lgeorget

Linux 사람들은 ELF를 지원하기 위해 이전 Sun 링커 소스 코드를 해킹했습니다. ldconfig링커 캐싱이 오류에 너무 민감하여 AT & T와의 계약 에서 Sun의 새로운 ELF 구현이 제거 되었습니다. 썬은 나중에 추가 the tree stooges: moe, laricrleELF 관리를위한 도우미 프로그램 등.
schily

2

:LD_LIBRARY_PATH로 전역 대체 (공백)

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

gcc로 간단한 테스트 프로그램을 컴파일하고 라이브러리를 연결할 수 있습니다. 그런 다음 ldd를 사용하여 사용 된 라이브러리를 확인할 수 있습니다. 나는 이와 같은 것을 사용한다 :

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed 라이브러리의 심볼이 사용되지 않기 때문에 링커에서 라이브러리를 버리지 않습니다.

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