2011-01-22 1 views
22

공유 라이브러리 또는 정적 라이브러리로 빌드 할 수있는 C++ 라이브러리를 사용하고 있습니다. 이 라이브러리는 프로그램이 시작될 때 정적 객체가 등록되고 정적 객체가 만들어지는 팩토리 기술을 사용합니다.gcc가 라이브러리에서 참조되지 않은 정적 C++ 객체를 강제로 연결하는 방법

공유 라이브러리가 사용되는 한 제대로 작동합니다. 정적 버전이 사용되면 정적 객체는 최종 프로그램에 포함되지 않으므로 (직접 참조되지 않기 때문에) 해당 기능을 사용할 수 없습니다.

gcc가 링크 할 때 라이브러리의 모든 정적 객체를 강제로 포함시키는 방법이 있습니까?

라이브러리는 오픈 소스이며 도움이된다면 수정할 수 있습니다.

답변

22

-Wl,--whole-archive -lyourlib을 사용할 수 있습니다. 자세한 내용은 ld의 맨 페이지를 참조하십시오.

-Wl, - whole-archive 이후에 언급 된 모든 정적 라이브러리가 명령 줄에 완전히 포함되면 필요에 따라 다시 해제 할 수 있습니다. -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

+5

-Wl - 전체 아카이브는 다른 라이브러리에 이미 포함되어 있거나 해결할 수없는 일부 심볼을 ​​포함시킵니다. 통계를 포함하는 더 정교한 방법이 있습니까? –

+0

이것은 의미가 없습니다. Gene : 공유 라이브러리를로드하는 것과 동일합니다. 전체 라이브러리 만 얻을 수 있습니다. 틀림없이 ld는 외부 참조를 찾는 것에 대한 망쳐 쓴 개념을 가지고 있으므로 올바른 순서를 얻어야합니다. – Yttrill

+7

'-Wl, - no-whole-archive'로 동작을 종료하는 것은 더 이상 포함 할 라이브러리가 없더라도 실제로 선택 사항이 아닙니다. GCC는 명령의 끝에 모든 표준 시스템 라이브러리를 추가 할 것입니다. 그래서'--whole-archive'를 남겨두면 그것들 모두에 영향을받을 것이고 중복 된 심볼 문제가 발생할 것입니다 @GeneVincent는 –

1

해킹이 나를 도와주었습니다. 그래도 헤더를 포함해야합니다.

// in the header with your class 
struct RegistrationHelper { 
    RegistrationHelper(); 
}; 

static RegistrationHelper Helper; 

// in your cpp where you register your class 
RegistrationHelper::RegistrationHelper() {} 
+0

하지만 정적 라이브러리의 모든 단일 등록 도우미 객체를 알아야하는'.cpp' 저자의 공동 작업이 있다고 가정합니다. – einpoklum