Xcode: почему происходит переименование to.mm ошибка с неопределенным символом "gxx personality sj0" только в статической библиотеке?
Я только что переименовал один файл реализации класса Objective-C в статической библиотеке / framework from .м .мм, а затем связывание происходит следующая ошибка:
Undefined symbols for architecture armv7s: "___gxx_personality_sj0"
Я могу решить ее, добавив -lc++
(libc++.dylib) к другим флагам компоновщика цели приложения. Но на самом деле мой вопрос таков: почему он терпит неудачу? Почему эта проблема возникает только в статическом коде библиотеки, но не при переименовании одного из файлов реализации приложения?
И есть ли какие-либо другие решения, кроме добавления -lc++
?
Примечание: реализация класса не содержит никакого кода вообще. В этом классе также не используется и не импортируется код C++, как и нигде в другом месте проекта.
1 ответ:
Когда вы создаете статическую библиотеку, вы не связываете ее с зависимыми библиотеками. В результате при переименовании одного из файлов из
.m
в.mm
он начинает зависеть от функций C++, таких как разматывание стека при получении исключений. Даже если вы скажете компилятору, что у вас нет намерения использовать исключения (путем отрицания исключенийC++
в флагах компиляции), он все равно должен знать потенциальный механизм размотки стека (это то, что переменная personality средства).Причина, по которой шаблонные приложения из Cocos2d+Box2d не имеют этой проблемы, заключается в том, что они обладают некоторыми файлами
.mm
; в результате компилятор c++ используется для выполнения последней ссылки, которая автоматически тянет в библиотеку c++.