Xcode:为什么重命名为 .mm 失败,仅在静态库中"___gxx_personality_sj0"未定义的符号?

Xcode: why does renaming to .mm fail with undefined symbol "___gxx_personality_sj0" in static library only?

本文关键字:gxx personality sj0 符号 未定义 静态 命名为 重命名 为什么 mm 失败      更新时间:2023-10-16

我刚刚将静态库/框架中的一个 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++ 库。

相关文章:
  • 没有找到相关文章