XCode и iPhone SDK: стандартный тип библиотеки C ++? - PullRequest
2 голосов
/ 18 ноября 2009

Поскольку я новичок во всех вещах, связанных с C ++ и gcc, мне нужно понять что-то потенциально важное. Если я использую файлы .mm в новом проекте iphone, выход которого является статическим lib, я получаю эту ошибку:

"___ gxx_personality_v0", по ссылке с:

Если я изменю тип стандартной библиотеки C ++ с динамического (по умолчанию) на статический, ошибка исчезнет. Это ограничение SDK? Могут ли расширения Obj-C ++ НЕ быть включены в динамической библиотеке? Имейте в виду, что я новичок, и я только притворяюсь, что знаю, о чем я говорю здесь. Я также хочу знать разницу между этими настройками, и если их изменение может оказать негативное влияние. Верно ли мое предположение о том, что динамическая библиотека загружается во время выполнения, а статическая библиотека связана с окончательным двоичным файлом во время сборки? Если это так, то почему iPhone SDK позволяет создавать динамическую библиотеку? Вы не можете устанавливать сторонние библиотеки на iPhone до настоящего времени и делиться ими между приложениями.

Обновление Несколько человек ответили, и я ценю ответы. Однако я хочу уточнить кое-что, что кажется неправильно понятым из моего первоначального вопроса. Переключение типа файла с «.m» на «.mm» не является ответом, скорее это то, что вызвало исключение. Ситуация такова: разработайте статическую библиотеку для iPhone, которая использует файлы Obj-C ++ с расширением ".mm". Затем используйте эту библиотеку в приложении для iPhone (или в модульном тесте). Если цель клиента не переключена на использование «статического» вместо по умолчанию «динамического» для типа библиотеки Std C ++, вы увидите эту ошибку. Первоначально я думал, что, возможно, вносил незначительную ошибку, изменяя этот параметр, но сейчас я пытаюсь понять разницу и почему значение по умолчанию установлено способом, который кажется противоположным типичному варианту использования.

Ответы [ 3 ]

2 голосов
/ 19 ноября 2009

Мартин Йорк прав, что вы компилируете с неверным компилятором, но файловая система по умолчанию для OSX не чувствительна к регистру, поэтому вы не можете использовать «.M», чтобы на практике указать Obj-C ++. Вам необходимо присвоить файлам Obj-C имя .m, а файлам Obj-C ++ - .mm.

Хотя вы не можете использовать Obj-C ++ в файлах .m, вы, безусловно, можете связать файлы .m с кодом C ++. Нет проблем при смешивании Obj-C, Obj-C ++ и C ++ в одном проекте. Просто назовите ваши файлы правильно, чтобы вы использовали правильный компилятор:

  • м - Obj-C
  • мм - Obj-C ++
  • cpp - C ++

Вы правы, что не можете загружать частные динамические библиотеки во время выполнения на iPhone. Xcode допускает это по двум причинам: Mac разрешает динамические библиотеки (и поэтому было бы очень сложно иметь код для особого случая в IDE на основе SDK), а разработчики Apple могут создавать и создают динамические библиотеки на iPhone. Так что Xcode не запрещает этого; они просто не дают вам шаблон для этого.

0 голосов
/ 06 апреля 2016

В XCode> с включенным ARC и в Test target я получил эту ошибку ___gxx_personality_v0 с файлами с расширением .mm. Когда я переименовал файлы с расширением .mm до .m, это решило проблему.

0 голосов
/ 18 ноября 2009

*. M - расширение Obj-C.
* .M является расширением Obj-C ++.

Переименуйте ваши файлы, чтобы компилятор использовал стандартную библиотеку C ++ при компоновке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...