2010-02-03 1 views
9

이 질문의 제목은 exact dupe이지만 그 질문에 대한 답은 저에게 도움이되지 않습니다.정적 라이브러리를 공유 라이브러리로 변환 (libsome.a에서 libsome.so 작성) : 내 심볼은 어디에 있습니까?

% g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp 
% g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp 
% ar -rc libsome.a foo.o bar.o 

내가 대신 오브젝트 파일의 libsome.a에서 libsome.so 생성하고 싶습니다,하지만 라이브러리는 정말입니다 :

나는 정적 라이브러리에 포장 오브젝트 파일의 무리가 베어 :

% g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a 
% nm -DC libsome.so 
0000xxxx A _DYNAMIC 
0000xxxx A _GLOBAL_OFFSET_TABLE_ 
     w _Jv_RegisterClasses 
0000xxxx A __bss_start 
     w __cxa_finalize 
0000xxxx A _edata 
0000xxxx A _end 
0000xxxx T _fini 
0000xxxx T _init 

정적 라이브러리는 괜찮습니다, 또는 적어도 나는 완벽하게 실행에 연결 할 수있어 그것이 포함 된 기능을 실행할 수 있습니다. 또한, foo.o와 bar.o에서 libsome.so를 생성하면 모든 것이 잘됩니다.

답변

22

GNU 링커를 사용한다고 가정하면 정적 아카이브의 모든 내용을 얻을 수 있도록 --whole-archive 옵션을 지정해야합니다. 그는 링커 옵션이기 때문에, 당신은 링커에 통과 GCC에게 -Wl가 필요합니다

g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a 

당신이 라이브러리의 모든 원하는 더 복잡한 일을한다면 어떤하지만 라이브러리의 부분 만 당신이 GNU 링커를 사용하지 않는 경우

... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a 

것은, 당신이 당신의 링커를 지원하는지 확인해야합니다 : 당신이 libsome에 사용했습니다 후 libsome에 필요한 지원을, 당신은 전체 아카이브를 해제 할 것 그리고 그것이 무엇이라고 부르는 지. Sun 링커에서는 -z allextract-z defaultextract이라고합니다.

+0

+1 너 거기. 나는 "남자"를 시도하고 그것을 놓쳤다. –

+0

감사합니다. ld 맨 페이지를 위아래로 검색했지만 어떻게 든이 옵션을 놓쳤습니다. –

+0

이제이 훌륭한 대답 만이 CMake 프로젝트로 이것을 설정하는 방법을 나타낼 수 있습니다! 감사 –

1

참조하는 파일이 없기 때문에 .a 파일에서 파일을 가져 오지 않습니다. 왜 .a 파일을 먼저 만들고 있습니까? .o 파일을 -r 옵션과 연결하여 운이 좋으면 좋을 것입니다.

+0

foo.o와 bar.o에서 libsome.so를 빌드 할 때 기호를 참조하는 것도 없지만 라이브러리에서 끝납니다. '.a' 파일은 정확히 두 개의'.o' 파일들이 합쳐진 파일이기 때문에 포함 된 오브젝트 파일 대신에 그것을 사용하는 간단한 방법이 있어야합니까? –

+0

오브젝트 파일은 그 안에있는 기호가 참조되는 경우에만 .a 파일에서 추출되기 때문에. .o 파일은 항상 링크되거나, 참조되거나 또는 링크되지 않습니다. –

+0

내 상황을 무시하고 정적 라이브러리를 공유 된 것으로 변환 할 수있는 방법이 있습니까? * .o 파일이 사용 된 것처럼 *? ('ar -x'할인) –

관련 문제