Создание статической библиотеки Objective-C ++ в Xcode - PullRequest
11 голосов
/ 17 мая 2010

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

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

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

Ответы [ 4 ]

25 голосов
/ 20 апреля 2012

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

18 голосов
/ 17 мая 2010

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

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

1 голос
/ 24 февраля 2015

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

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

1 голос
/ 17 мая 2010

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

...