공유 객체 (.so)는 라이브러리가 아니며 객체입니다. 일부를 추출하여 다른 라이브러리에 삽입 할 수 없습니다.
다른 개체를 참조하는 공유 개체를 작성하면 수행 할 수있는 작업 - 실행시 다른 개체가 필요합니다. libfoo를 연결할 때 -lbar를 추가하십시오.
libbar를 빌드 할 수 있다면 분명 libfoo와 libbar가 결합 된 라이브러리를 만들 수 있습니다. IIRC를 사용하면 링커가 libfoo 인 라이브러리와 libbar에 필요한 .o를 연결하여 libbar의 필요한 부분을 만들 수 있습니다. 예 : 당신이 정적 라이브러리에 의존하는 시스템 라이브러리의 정적으로 링크 라이브러리가있는 경우
gcc -fPIC -c lib1.c # define foofn(), reference barfn1()
gcc -fPIC -c lib2a.c # define barfn1(), reference barfn2()
gcc -fPIC -c lib2b.c # define barfn2()
gcc -fPIC -c lib2c.c # define barfn3()
gcc -c main.c # reference foofn()
ar -cru libbar.a lib2*.o
gcc -shared -o libfoo.so lib1.o -L. -lbar
nm libfoo.so | grep barfn2() # ok, not here
gcc -o prog main.o -L. -lfoo
env LD_LIBRARY_PATH=. ./prog # works, so foofn(), barfn1() and barfn2() are found
를 작동하는 방법의 예를 들어 libtool manual on Inter library dependencies를 참조? 이상적으로는 태그에있을 것입니다. –
리눅스에서 실행 –
사이드 노트; -lbar를 사용할 필요가 없을뿐만 아니라 링커가 시작할 때 링커는 * 자신의 코드가 참조하지 않는 (콜 체인을 통해 직접 또는 간접적으로) 모든 심볼을 제거합니다. 이렇게하면 실행 파일이 줄어들고 앱이 더 빨리 시작될 수 있습니다! – Armentage