2011-07-05 1 views
0

내 정적 C++ 라이브러리에는 생성자가있는 전역 객체가 포함되어 있습니다. 테스트 프로그램은 Apple의 gcc 4.2.1을 기반으로 작성되었으며 실행시 객체가 0으로 초기화되었음을 알 수 있지만 생성자는 호출되지 않습니다. 정적 클래스 멤버 변수에 대해서도 마찬가지입니다.Mac OS X의 정적 C++ 라이브러리에 연결 : 라이브러리의 전역 객체 생성자가 호출되지 않습니다.

-force_load 옵션을 ld에 제공하면이 문제를 해결할 수 있지만 큰 실행 파일 크기로 인해이 방법이 적합하지 않습니다. 전역 개체가 정의 된 파일에서 함수를 참조하려고했지만 아무 효과가 없습니다.

Linux (gcc 4.5.1)에서 동일한 코드를 작성할 때 그러한 문제는 없습니다.

+0

마지막 링크는 어떻게하고 있습니까? 예 : 'gcc','g ++','ld'? –

+0

'g ++'을 사용합니다 (결과적으로'ld'가 사용됩니다) – stkuzma

답변

0

이진 파일을 아카이브 (.a)에 링크 할 때 링커는 이진 파일에서 확인되지 않은 심볼 만 아카이브에서 가져 오기 때문입니다. 즉, 바이너리가 아카이브의 전역 (또는 정적) 객체를 참조하지 않는 경우 해당 객체의 심볼과 초기화 코드는 링크되지 않습니다.

아카이브 및 참조되지 않은 전역 객체의 일반적인 문제입니다 . 일반적인 해결책은 어떻게 든 바이너리의 객체를 참조하는 것입니다 (예 : sizeof 가져 오기). 또는 전역 객체의 생성자가 수행해야하는 작업을 수행하는 초기화 함수를 제공하고 이진 호출이 작동하도록합니다.

+0

답장을 보내 주셔서 감사합니다. 전역 객체를 참조하려고했습니다. 그러나 다시는 성공하지 못했습니다. 그것은 링커의 버그 인 것 같습니다 ... – stkuzma

+0

'static_cast (& global_object_in_archive)'와 같은 바이너리 코드에서 참조해야합니다. 확실히 링커 버그가 아닙니다. –

+0

그리고 같은 결과가 다시 나타납니다. – stkuzma