使用 Objective-C++ 时单元测试未解析的符号

Posted

技术标签:

【中文标题】使用 Objective-C++ 时单元测试未解析的符号【英文标题】:Unit test unresolved symbol when using Objective-C++ 【发布时间】:2013-06-21 05:53:11 【问题描述】:

我正在尝试为我的项目创建单元测试,我有几个项目的工作区,其中包含数十个静态库和应用程序。因此,我在这个工作区中为静态库创建了一个新项目,并向其中添加了 Cocoa Touch UnitTest 包。然后我为这个工作区中的一个库中的一个函数添加了一个测试,比如说库 X,我还向我的单元测试包添加了链接依赖项到 lib X。但是当我运行单元测试时 (Cmd + U)。我收到链接器错误:

Undefined symbols for architecture i386:"_OSVersion", referencedfrom:-[MyUnitTest testMethodFromLibX] in MyUnitTestTest.o "_methodFromLibX", referenced symbol(s) not found for architecture i386

为什么测试包没有与库 X 链接?我可以在 build 文件夹中看到 libX.a 和 MyUnitTests.octet。

【问题讨论】:

【参考方案1】:

好的,谢谢大家,我找到了问题的原因——我的 libX 是 Objective-C++ 库,所以链接器破坏了所有名称,但我的单元测试是 Objective-C 库,所以当它链接时显然不能按名称查找方法或类,因为链接不同。因此,我将单元测试转换为 Objective-C++ 库(只是更改了 *.m -> *.mm)并且一切正常!

【讨论】:

【参考方案2】:

单元测试在模拟器中运行,因此每个库都需要有 x386 版本。您可以使用命令行来检查每个 - 我相信“file lib.a”会这样做,但快速谷歌搜索会找到名称。

【讨论】:

谢谢大卫,问题是我的 ios 应用程序中使用了库 X,它在模拟器下成功运行,所以我很确定 lib X 有 x386 版本。 如果你可以上传一个简化的演示项目,我和其他人可以看到问题所在。

以上是关于使用 Objective-C++ 时单元测试未解析的符号的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 单元测试是不是需要头文件?

iOS Swift 单元测试导致标识符未解析

Objective-C 库的 Swift “使用未声明的类型”

Objective-C 库的 Swift “使用未声明的类型”

未解析的标识符 - Swift 中的 Objective-C Pod

无法在快速单元测试中使用 Objective-C 类