3

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

Undefined symbols for architecture armv7s: "___gxx_personality_sj0"

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

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

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

4

1 回答 1

3

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

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

于 2013-09-14T20:01:13.803 回答