2010-05-17 5 views
10

그래서 저는 몇 가지 게임을 만들고 싶은 iPhone 용 엔진을 개발했습니다. 각 게임의 프로젝트 디렉토리 안에 엔진 용 파일을 복사하여 붙여 넣기보다는 각 게임의 엔진에 연결하는 방법이 있습니다. 변경해야 할 경우 한 번만해야합니다. 조금 뒤돌아 쳐 보면, 정적 라이브러리가 iPhone에서이 작업을 수행하는 가장 좋은 방법 인 것 같습니다.Xcode에서 Objective-C++ 정적 라이브러리 만들기

나는 Skeleton이라는 새로운 프로젝트를 생성하고 모든 엔진 파일을 복사했습니다. 나는 this 가이드를 사용하여 정적 라이브러리를 만들고, Chooser라는 프로젝트에 라이브러리를 가져 왔습니다. 그러나 프로젝트를 컴파일하려고 할 때 Xcode는 ControlScene.mm이라는 파일에 포함 된 일부 C++ 데이터 구조에 대해 불평하기 시작했습니다. 여기에 내 빌드 오류가 있습니다 :

"operator delete(void*)", referenced from: 


     -[ControlScene dealloc] in libSkeleton.a(ControlScene.o) 


     -[ControlScene init] in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::deallocate(operation_t*, unsigned long)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t*>::deallocate(operation_t**, unsigned long)in libSkeleton.a(ControlScene.o) 


    "operator new(unsigned long)", referenced from: 


     -[ControlScene init] in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t*>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


    "std::__throw_bad_alloc()", referenced from: 


     __gnu_cxx::new_allocator<operation_t*>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


    "___cxa_rethrow", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


    "___cxa_end_catch", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


    "___gxx_personality_v0", referenced from: 


     ___gxx_personality_v0$non_lazy_ptr in libSkeleton.a(ControlScene.o) 


     ___gxx_personality_v0$non_lazy_ptr in libSkeleton.a(MenuLayer.o) 


    "___cxa_begin_catch", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


ld: symbol(s) not found 


collect2: ld returned 1 exit status 

누군가이 문제가 발생하는 이유에 대한 통찰력을 제공 할 수 있다면, 고맙겠습니다.

답변

17

문제는 라이브러리가 libstdC++에 대해 동적으로 링크하고 있다는 것입니다. 라이브러리를 빌드 할 때 "-static", "-static-libstdC++"및 "-static-libgcc"를 다양한 조합으로 시도해야합니다 (라이브러리 중 어느 것이 필요할지 모르지만 일부 조합은 완전히 고정 시키십시오).

편집
글쎄, 당신은 동적 그래서 실제로 더 나은 솔루션은 단순히 (즉, 명시 적으로 된 libstdc에 대한 링크 ++)의 "-lstdC++"넣어하는 것입니다, 아이폰 ++ 된 libstdc에 대한 링크 허용되는 것으로 나타났다 귀하의 빌드.

+0

이들은 어디에 있습니까? – LandonSchropp

+0

@helixed, Makefile 또는 명령 행에서 라이브러리를 빌드하는 경우 g ++의 호출에 추가 할 수 있습니다. Xcode를 사용하고 있다면, 당신이 입력 할 수있는 프로젝트 빌드 설정에 "다른 플래그"같은 것이 있다고 생각합니다. –

+1

그래, 완벽하게 작동했습니다. 누군가를 궁금해하는 경우를 대비하여 다른 링커 플래그를 설정하는 것이 좋습니다. 도와 주셔서 감사합니다. – LandonSchropp

1

Chooser에 대한 빌드 설정으로 이동하여 "소스를 컴파일하십시오"를 검색하고 Objective-C++를 선택하여 문제를 해결했습니다. 이것은 아마도 더러운 해결책이지만 작동했습니다.

+0

libstdC++에 링크 되었기 때문에 작동했습니다. –

+0

이것은 -lstdC++ 플래그를 추가하는 것과 동일한 효과가 있음을 의미합니까? –

24

.framework을 연결하려고 할 때 나는이 문제에 달렸다 다른 링커 플래그

+0

이것은 나를 위해 일했습니다. – Manali

+0

위대한 !! .... +1 – TheTiger

1

에 "-lstdC++"를 설정합니다. 나는 (Compile Sources 단계로) 소스로 cppstub.mm 파일

나는 당신이이 작업을 수행 할 때, 왜

을 묻지 않는 C++ 컴파일의 일종을 강제해야 추측을 추가하여 그것을 해결하기 위해 관리했습니다
관련 문제