Xcode: почему происходит переименование to.mm ошибка с неопределенным символом "gxx personality sj0" только в статической библиотеке?


Я только что переименовал один файл реализации класса Objective-C в статической библиотеке / framework from .м .мм, а затем связывание происходит следующая ошибка:

Undefined symbols for architecture armv7s: "___gxx_personality_sj0"

Я могу решить ее, добавив -lc++ (libc++.dylib) к другим флагам компоновщика цели приложения. Но на самом деле мой вопрос таков: почему он терпит неудачу? Почему эта проблема возникает только в статическом коде библиотеки, но не при переименовании одного из файлов реализации приложения?

И есть ли какие-либо другие решения, кроме добавления -lc++?

Примечание: реализация класса не содержит никакого кода вообще. В этом классе также не используется и не импортируется код C++, как и нигде в другом месте проекта.

1 3

1 ответ:

Когда вы создаете статическую библиотеку, вы не связываете ее с зависимыми библиотеками. В результате при переименовании одного из файлов из .m в .mm он начинает зависеть от функций C++, таких как разматывание стека при получении исключений. Даже если вы скажете компилятору, что у вас нет намерения использовать исключения (путем отрицания исключений C++ в флагах компиляции), он все равно должен знать потенциальный механизм размотки стека (это то, что переменная personality средства).

Причина, по которой шаблонные приложения из Cocos2d+Box2d не имеют этой проблемы, заключается в том, что они обладают некоторыми файлами .mm; в результате компилятор c++ используется для выполнения последней ссылки, которая автоматически тянет в библиотеку c++.