Xcode:为什么重命名为.mm会在静态库中使用未定义的符号“___gxx_personality_sj0”失败?

时间:2013-09-14 17:23:47

标签: c++ objective-c xcode linker linker-errors

我刚刚在.m到.mm的静态库/框架中重命名了一个Objective-C类实现文件,然后链接失败并出现此错误:

Undefined symbols for architecture armv7s: "___gxx_personality_sj0"

我可以通过将-lc++(libc ++。dylib)添加到应用程序目标的其他链接器标志来解决此问题。但我的问题是:为什么会失败?为什么此问题仅出现在静态库代码中,但在重命名应用程序的实现文件时却不出现?

除了添加-lc++之外还有其他解决方案吗?

注意:该类的实现不包含任何代码。在这个类中也没有使用或导入C ++代码,也没有在项目的其他地方使用C ++代码。

1 个答案:

答案 0 :(得分:3)

创建静态库时,不要在依赖库中进行链接。因此,当您将其中一个文件从.m重命名为.mm时,它现在开始依赖于C ++功能,例如在接收异常时堆栈展开。即使您告诉编译器您没有使用异常的意图(通过拒绝编译标志中的C++异常),它仍然需要知道用于堆栈展开的潜在机制(这就是人格变量的意思。)

来自Cocos2d + Box2d的模板应用程序没有这个问题的原因是它们拥有一些.mm个文件;因此,c ++编译器用于执行最终链接,这会自动引入c ++库。