2009-09-20 4 views
4

iPhone 응용 프로그램에서 사용할 정적 라이브러리를 만듭니다. 여기에는 심볼을 내보내는 많은 소스 파일이 포함되어 있습니다. 클래스의 정적 인스턴스를 인스턴스화하면 생성자에서 여러 가지를 중앙 관리 클래스에 등록하는 코드가 다른 곳에서 실행됩니다. 이 코드는 표준 iPhone 응용 프로그램의 일부로 빌드 할 때 모두 잘 작동하지만 정적 라이브러리로 분리 된 경우이 파일은 최종 응용 프로그램 이진 파일로 만들지 않으므로 포함 된 개인 클래스 인스턴스의 생성자가 도망 가면 문제가 생깁니다. 필자는 정적 라이브러리 빌드와 최종 어플리케이션 빌드 모두에 대해 데드 스트립 핑과 같은 모든 빌드 옵션을 해제했습니다.심볼을 내보내지 않는 정적 라이브러리 오브젝트 파일 포함 (GCC/iPhone)

이전에 Metrowerks 컴파일러에서이 문제가 발생했지만 중간 라이브러리가없는 단일 응용 프로그램에 코드가 빌드 된 경우에도이 문제가 발생했습니다. 해결책은 매우 간단했습니다. 개인 클래스 인스턴스에 __declspec(force_export)을 사용하면 모두 잘됩니다.

GCC/iPhone에 해당하는 항목이 있습니까? GCC 4.2와 Xcode 3.1.4를 사용하고 있으며 iPhone OS 3.1을 대상으로합니다. 또는 명시 적으로 참조되는지 여부에 관계없이 정적 라이브러리의 모든 오브젝트 파일을 링크하도록 응용 프로그램에 알리는 방법이 있습니까? ar을 사용하여 개체 파일의 전체 집합이 정적 라이브러리에 들어 있다는 것을 확인했습니다.

미리 감사드립니다.

답변

5

난 당신이 찾고있는 옵션이 -all_load 생각 : 당신이 많은 도서관 및/또는 프레임 워크 (맥 OS X)를 연결하는 일이면

-all_load 
     Loads all members of static archive libraries. See man ld(1) for 
     more information. 
+0

환상적인! 그게 정확히 필요한 것입니다 :-). –

3

-all_load 몇 가지 문제가 있습니다. 이 경우 -force_load을 사용하여 모든 기호를 강제로 사용해야합니다.

g++ test.cpp -o test -force_load libtoload.a 
+0

흠 ... 테스트를 마치면 "force_load"가 작동하지 않는 것 같습니다 (Mac OS 10.6.2). 그러나 "all_load"는 마침내 프레임 워크와 함께 정상적으로 작동했습니다. – gaspard

관련 문제