Создание статической библиотеки Objective-C ++ в Xcode

Итак, я разработал движок для iPhone, с которым мне хотелось бы создать пару разных игр. Вместо того, чтобы копировать и вставлять файлы для движка внутри каждого каталога игрового проекта, я бы мог связать двигатель с каждой игрой, поэтому, если мне нужно внести изменения, мне нужно сделать это только один раз. После немного напоминания, кажется, что статические библиотеки - лучший способ сделать это на iPhone.

Я создал новый проект под названием Skeleton и скопировал все его файлы с машиной. Я использовал это руководство по созданию статической библиотеки, и я импортировал библиотеку в проект под названием Chooser. Однако, когда я попытался скомпилировать проект, Xcode начал жаловаться на некоторые структуры данных С++, включенные в файл 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<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

Если бы кто-нибудь мог рассказать о том, почему эти проблемы происходят, я буду признателен.

Ответ 1

Проблема в том, что ваша библиотека динамически связывается с libstdС++. Что касается того, как это исправить, вы должны попробовать "-статический", "-static-libstdС++" и "-static-libgcc" в различных комбинациях при создании вашей библиотеки (не уверены, какие из них необходимы, но какая-то их комбинация должна сделайте его полностью статическим).

Изменить
Ну, получается, что вам разрешено динамически связываться с libstdС++ на iPhone, поэтому на самом деле лучшим решением является просто поместить "-lstdС++" в (явным образом, ссылку на libstdС++) в вашей сборке.

Ответ 2

Установите "-lstdС++" в другие флаги компоновщика

Ответ 3

Я исправил проблему, перейдя в настройки сборки для Chooser, выбрав "Compile Source As" и выбрав Objective-C ++. Это, вероятно, грязное решение, но оно сработало.

Ответ 4

Я столкнулся с этой проблемой при попытке связать .framework. Мне удалось исправить это, добавив пустой cppstub.mm файл в качестве источника (до Compile Sources)

Я предполагаю, что это должно быть принудительная компиляция С++, когда вы это делаете, не спрашивайте меня, почему