Создание Objective C ++ статическая библиотека в XCode

Таким образом, я разработал механизм для 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

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

11
задан LandonSchropp 20 July 2013 в 22:18
поделиться

2 ответа

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

Edit
Ну, оказывается, вам разрешено динамически ссылаться на libstdc++ на iPhone, поэтому на самом деле лучшим решением будет просто поместить «-lstdc++» в (то есть явно связать с libstdc++) в вашей сборке.

18
ответ дан 3 December 2019 в 01:08
поделиться

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

1
ответ дан 3 December 2019 в 01:08
поделиться