2010-05-11 4 views
6

몇 가지 수제 기능을 가진 공유 라이브러리가 있는데, 다른 프로그램으로 컴파일하지만 정적 라이브러리를 컴파일하는 데 사용한 모든 라이브러리와 최종 프로그램을 연결해야합니다. 다음은 예입니다.정적으로 공유 라이브러리 컴파일

다른 라이브러리의 기능이 필요한 라이브러리에 foo 기능이 있습니다. libbar.so.

내 주 프로그램에서 foo 기능을 사용하려면이 파일을 -lbar 플래그로 컴파일해야합니다. 컴파일 할 수있는 방법이 있습니까 라이브러리가 정적으로 포함되어 있으므로 다른 라이브러리의 모든 필수 코드가 포함되어 있으며 -lbar 플래그가 없어도 내 최종 프로그램을 컴파일 할 수 있습니까?

+0

를 작동하는 방법의 예를 들어 libtool manual on Inter library dependencies를 참조? 이상적으로는 태그에있을 것입니다. –

+0

리눅스에서 실행 –

+0

사이드 노트; -lbar를 사용할 필요가 없을뿐만 아니라 링커가 시작할 때 링커는 * 자신의 코드가 참조하지 않는 (콜 체인을 통해 직접 또는 간접적으로) 모든 심볼을 제거합니다. 이렇게하면 실행 파일이 줄어들고 앱이 더 빨리 시작될 수 있습니다! – Armentage

답변

5

공유 객체 (.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 
3

1 단계 (개체 파일을 만듭니다) :

gcc -c your.c -o your.o 

2 단계 (정적 라이브러리 만들기) :

ar rcs libyour.a your.o 

3 단계 (정적 라이브러리에 대한 링크) :

gcc -static main.c -L. -lyour -o statically_linked 
1

기본적으로, 당신은 그 모든 코드에서 정적으로 링크 할 수 있습니다.

나는 이유는 모르지만. * NIX 플랫폼의 공유 라이브러리 처리는 천재적인 작업이며 컴파일 된 프로그램 크기를 심각하게 줄입니다. 누락 된 라이브러리로 인해 다른 컴퓨터에서 코드를 실행할 수 없다는 걱정이 든다면 Linux 라이브러리 용으로 컴파일 된 대부분의 클로즈드 소스 프로그램의 경로를 취할 수 있습니다. GCC에 -Wl,--rpath -Wl,. 옵션을 사용하여 컴파일하고 바이너리와 함께 라이브러리.

2

당신은 libtool를 사용하여 작업 이런 종류의 물건을 얻을 수있는, 즉 명시 적으로 사용하고있는 플랫폼을 진술 할 수

관련 문제