기본 lib가 모든 종속성의 정적 라이브러리에서 컴파일되도록하는이 연결 요구 사항을 해결할 수있는 유일한 방법은 무엇입니까?
아니요. 공유 라이브러리는 자체가 의존하는 공유 라이브러리에 연결할 수 있습니다. 대부분의 링커는 해당 라이브러리를 선택하고 링커 단계에서 언급하지 않고도 해당 라이브러리에 실행 파일을 링크합니다.
공유 라이브러리가 필요한 라이브러리에 연결되지 않은 것처럼 들리는 경우가 있습니다. ldd 도구는 이와 관련하여 유용 할 수 있습니다.
gcc -shared foo.o -o libfoo.so -lm
가 이제 libfoo.so
이 수학 라이브러리 (libm의)에 연결되어 있습니다 : 예를 들어
, 당신이 공유 라이브러리를 생성 말한다. 을 libfoo.so를 링크 된 응용 프로그램뿐만 아니라 libm의에 링크 될 것입니다, 공유 라이브러리는 lib 디렉토리에 링크되지 않은 반면에 경우 그냥
gcc -o prog main.o -lfoo
을해야 할 것 즉, 만에 제작되었다 응용 프로그램을 링크 할 때 명시 적으로 연결해야 할 것
gcc -shared foo.o -o libfoo.so
은 libm의하기 : 당신이) (공유 라이브러리를한다면 dlopen 때
gcc -o prog main.o -lfoo -lm
, 런타임 링커는 모든로드 라이브러리를 공유 한 라이브러리는 이미로드되지 않은 경우에도 링크되었습니다.따라서 dlopen() 라이브러리가 의존하는 라이브러리에 연결되어 있지 않고 실행 파일이 해당 라이브러리에 링크되어 있지 않으면 dlopen()이 실패합니다 (RTLD_LAZY를 지정하지 않으면 나중에 실패합니다)
출처
2012-07-09 19:16:27
nos