我刚刚在.m到.mm的静态库/框架中重命名了一个Objective-C类实现文件,然后链接失败并出现此错误:
Undefined symbols for architecture armv7s: "___gxx_personality_sj0"
我可以通过将-lc++
(libc ++。dylib)添加到应用程序目标的其他链接器标志来解决此问题。但我的问题是:为什么会失败?为什么此问题仅出现在静态库代码中,但在重命名应用程序的实现文件时却不出现?
除了添加-lc++
之外还有其他解决方案吗?
注意:该类的实现不包含任何代码。在这个类中也没有使用或导入C ++代码,也没有在项目的其他地方使用C ++代码。
答案 0 :(得分:3)
创建静态库时,不要在依赖库中进行链接。因此,当您将其中一个文件从.m
重命名为.mm
时,它现在开始依赖于C ++功能,例如在接收异常时堆栈展开。即使您告诉编译器您没有使用异常的意图(通过拒绝编译标志中的C++
异常),它仍然需要知道用于堆栈展开的潜在机制(这就是人格变量的意思。)
来自Cocos2d + Box2d的模板应用程序没有这个问题的原因是它们拥有一些.mm
个文件;因此,c ++编译器用于执行最终链接,这会自动引入c ++库。