Таким образом, я разработал механизм для iPhone, с которым я хотел бы создать пару различных игр. Вместо того, чтобы копировать и вставлять файлы для механизма в каталоге проекта каждой игры, я был бы способ связаться с механизмом от каждой игры, поэтому если я должен внести изменение в него, я только должен сделать так однажды. После чтения вокруг немного, кажется, что статические библиотеки являются лучшим способом сделать это на iPhone.
Я создал новый проект под названием Скелет и скопировал все мои файлы механизма к нему. Я использовал это руководство для создания статической библиотеки, и я импортировал библиотеку в проект под названием Селектор. Однако, когда я пытался скомпилировать проект, XCode начал жаловаться на некоторые структуры данных C++, которые я включал в файл по имени ControlScene.mm. Вот мои ошибки сборки:
"operator delete(void*)", referenced from:
-[ControlScene dealloc] in libSkeleton.a(ControlScene.o)
-[ControlScene init] in libSkeleton.a(ControlScene.o)
__gnu_cxx::new_allocator::deallocate(operation_t*, unsigned long)in libSkeleton.a(ControlScene.o)
__gnu_cxx::new_allocator::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::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o)
__gnu_cxx::new_allocator::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o)
"std::__throw_bad_alloc()", referenced from:
__gnu_cxx::new_allocator::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o)
__gnu_cxx::new_allocator::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o)
"___cxa_rethrow", referenced from:
std::_Deque_base >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o)
std::_Deque_base >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o)
"___cxa_end_catch", referenced from:
std::_Deque_base >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o)
std::_Deque_base >::_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 >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o)
std::_Deque_base >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
Если кто-либо мог бы предложить некоторое понимание относительно того, почему эти проблемы происходят, я ценил бы его.
Проблема в том, что библиотека динамически компонуется с libstdc++. Что касается того, как это исправить, вы должны попробовать «-static», «-static-libstdc++» и «-static-libgcc» в различных комбинациях при построении вашей библиотеки (не уверен, какие из них нужны, но некоторая их комбинация должна сделать ее полностью статичной).
Edit
Ну, оказывается, вам разрешено динамически ссылаться на libstdc++ на iPhone, поэтому на самом деле лучшим решением будет просто поместить «-lstdc++» в (то есть явно связать с libstdc++) в вашей сборке.
Я решил проблему, зайдя в настройки сборки для Chooser, поискав "Compile Source As" и выбрав Objective-C++. Возможно, это грязное решение, но оно сработало.