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