2013-02-15 1 views
15

GCC/Linux와 공유 라이브러리를 만드는 데 문제가 있습니다. 현재이 공유 라이브러리는 GCC/libtool 옵션 "-shared"로 생성되며 모든 것이 정상입니다.빌드하는 동안 정적 라이브러리를 공유 라이브러리에 연결 하시겠습니까?

공유 라이브러리에 필요한 몇 가지 기능을 제공하므로이 공유 라이브러리에 추가해야하는 정적 라이브러리 (.a- 파일)가 두 개 추가되었습니다. 이 정적 라이브러리를 "-l"옵션과 함께 추가하면 도움이되지 않습니다. 이후에는 .so 파일에 포함되지 않습니다.

GCC/libtool이 공유 라이브러리에이 정적 라이브러리의 코드를 추가하도록하려면 어떻게해야합니까?

감사합니다.

+0

이 실행 파일을 만들려면 그냥 GCC의 건물 옵션에 정적 라이브러리의 전체 경로를 추가 할 수 있습니다, 'gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ...'그것은 다음과 같습니다. 공유 라이브러리를 만드는데도 사용할 수 있습니다. 시도 해봐. – fritzone

+0

".so 파일의 일부가 아닌"것을 어떻게 알 수 있습니까? –

+0

@fritzone : 문제없이 작동하는 실행 파일의 경우 공유 라이브러리에 대해 수행해야합니다. – Elmi

답변

21

링커가 공유 라이브러리에 전체 정적 라이브러리 콘텐츠를 포함하도록 지시하려면이 경우에는 --whole-archive 링커 옵션이 필요합니다. man ld에서

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive 

다음 --whole 아카이브 옵션 다음 명령 줄에 언급 된 각 아카이브에 대한

, 모든 오브젝트 링크에서 아카이브 파일이 아닌 검색을 포함 필수 오브젝트 파일에 대한 아카이브. 이것은 일반적으로 아카이브 파일을 공유 라이브러리로 변환하여 모든 오브젝트를 결과 공유 라이브러리에 포함시키는 데 사용됩니다. 이 옵션은 두 번 이상 사용될 수 있습니다.

gcc에서이 옵션을 사용할 때 두 가지주의 사항 : 먼저 gcc는이 옵션에 대해 알지 못하므로 -Wl, -whole-archive를 사용해야합니다. 둘째, -Wl, -no-whole-archive을 g 용하는 것이 gcc가 자신의 링크 목록에 링크를 추가하기 때.에이 플래그가 이들에 영향을 미치지 않도록 할 수 있습니다.

+0

'-WL,'다음에 봇 대시를 사용해야했습니다. – stefanct

2

는 당신은 라이브러리를 포함 링커에 --whole 아카이브 매개 변수를 필요로하지만, 타의 추종을 불허하는 문자에서 자신의 요구를 추론 할 수 있어야한다.

명령 행에 어떤 정적 라이브러리가 의존하는 객체 파일을 쫓을 있는지 확인은 예 :

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so 
관련 문제