iOS 应用程序的 Xcode 单元测试中的链接问题与嵌入式 C++ 代码

Posted

技术标签:

【中文标题】iOS 应用程序的 Xcode 单元测试中的链接问题与嵌入式 C++ 代码【英文标题】:Link problems in Xcode unit test of iOS app with embedded C++ code 【发布时间】:2019-04-12 02:37:15 【问题描述】:

我正在尝试修复我们的单元测试。 ios 应用程序很复杂,有许多开源库静态链接到应用程序二进制文件中,包括 Google protobuf 和 Boost。它们在我们的 iOS 应用项目的不同目标中构建为静态链接库,并链接到主应用。

到目前为止,这些库也直接链接到测试目标,即使应用程序托管测试。但是我在 Google Protobuf 初始化的早期遇到了一个问题,这让我认为该库在测试目标和主应用程序目标中的存在都是一个问题。所以我从测试目标中删除了静态库,认为引用该库中内容的 Objective-C++ 方法仍会在主应用程序可执行文件中找到它。情况似乎并非如此,因为链接器无法链接引用在链接到应用程序二进制文件的静态库中定义的 C++ 代码的测试文件。

Objective-C 和 Swift 代码似乎可以正确链接。

我不确定如何解决这种情况。据我了解 Xcode 单元测试,通常不会在测试目标中包含主应用程序的代码。但我不确定如何告诉 Xcode 我的测试文件需要能够链接到应用程序中的任意代码。

这一切都在 Xcode 10.1 中。

【问题讨论】:

【参考方案1】:

在生产代码和测试代码中必须链接到相同的库并不罕见。想象一个带有 Foo 对象的库,用于生产。一些测试会想要制作一个 Foo。但他们不能只是从应用程序中获取它。测试也需要链接到库。

【讨论】:

我不这么认为。我已经成功地将它链接到一个示例项目中。尝试将静态库链接到我的测试目标和应用程序目标的问题是它尝试两次实例化一些静态内容(protobuf),这会导致失败。

以上是关于iOS 应用程序的 Xcode 单元测试中的链接问题与嵌入式 C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试

Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)

我可以在 Xcode Server 中的所有设备上运行单元测试并仅在 iOS 9.x 设备上运行 UI 测试吗?

单元测试目标中的 xcode RunUnitTests 脚本?

单元测试iOS中的子模块静态函数? (斯威夫特 4 - Xcode)

单元测试 Xcode 4 的链接器错误