[英]Xcode 4 unit testing linker error
注意:“使用 GHUnit”不是这个问题的可接受答案。 我知道大多数人认为 GHUnit 比 Xcode4 OCUnit 更好,但这不是我要问的。 我将单独评估。
我有一个在 Xcode4 中从头开始创建的 Xcode 项目,在创建过程中选中了“包括单元测试”复选框。 我还包括了一些我在以前的项目中开发的库。 它们通过“将文件添加到 x...”对话框添加到项目中,并且仅添加到应用程序目标(而不是测试目标)。 它们在运行应用程序时工作正常,所以我认为它们设置正确。 我还为这个项目编写了许多不同的类。
我的测试文件以标准方式设置,名为 [AppName]Tests.h 和.m。
header 的代码:
#import < SenTestingKit/SenTestingKit.h >
@interface [AppName]Tests : SenTestCase {
@private
}
@end
实现代码:
#import "[AppName]Tests.h"
@implementation [AppName]Tests
- (void)setUp
{
[super setUp];
// Set-up code here.
}
- (void)tearDown
{
// Tear-down code here.
[super tearDown];
}
// Test methods go here
@end
这只是基本的骨架。 只要我不导入任何其他文件,它在我的其他项目中以及在这个项目中都可以正常工作。 当我从该项目导入另一个文件并使用它时,我在 Xcode output 日志中看到以下错误:
The test bundle at /Users/[Me]/Library/Developer/Xcode/DerivedData/[AppName]-dwuuuwcpmdqxqmgxomoniplwhlpb/Build/Products/Debug-iphonesimulator/[AppName]Tests.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.
我已经验证过:
关于可能导致这种情况的任何想法?
我必须将单元测试目标上的“测试主机”属性设置为$(BUNDLE_LOADER)
。 这解决了我的问题!
我做了以下事情:
http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/
深入了解Test_Hosts = $(BUNDLE_LOADER)
设置 Test_Hosts 解决了完全相同的问题!
我只是在这个和类似的错误上浪费了几个小时 - 结果我已经重命名了我的主要目标 - 尝试通过重命名相关变量和删除整个 DerivedData 目录来解决这个问题是不成功的。
我最终只是按照此处的步骤设置了一个新的单元测试目标: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/
现在一切都很好。
所以 - 如果你有奇怪的、莫名其妙的链接错误,你最好创建一个新的单元测试目标。 只需2分钟。
当我在运行单元测试时遇到 linker 错误时,有两件事可以解决我的问题。 第一个解决方案是将 Test After Build 构建设置设置为 YES 并选择 Product > Build For > Build For Testing 来运行测试。 此解决方案更易于实施。
第二种解决方案是将应用程序的实现文件添加到单元测试目标中。 通过选择 View > Utilities > File Inspector 打开文件检查器。 Select 项目导航器中的一个实现文件。 Select 文件检查器中单元测试目标旁边的复选框。
对于在模拟器中运行的 iPhone 应用程序,请确保 Test Host 构建设置为空白。 模拟器不支持应用程序托管的单元测试。
运行 Xcode 4.5.2 时遇到此错误 - 这是 2012 年 11 月 - 以上均无效。 似乎设置捆绑加载器和测试主机应该为您填写项目中的所有依赖项 - 或者在您的应用程序环境中运行测试或其他东西,但不幸的是对我不起作用。 它所做的是防止特定的 Xcode 警告有关哪些文件/库丢失。
对我有用的是添加一个新目标:cocoa 触摸单元测试,(确保捆绑加载器和测试主机构建设置为空),观察构建错误并手动添加缺少的依赖项 - 一个一个的所有源文件来自我需要的项目,然后是框架。 不是很优雅,但我很高兴让它工作。 不知道为什么我还没有尝试过这个 GHUnit 库。
我曾经遇到过同样的问题。 出于某种原因,我的项目的一个源文件也包含在为测试目标编译时,这会导致此链接错误。
通过确保只编译测试实现文件,您应该能够解决此错误。 您可以在以下位置查看:
TestTarget -> 构建阶段 -> 编译源
我知道这个问题已经很老了,但我只是在同样的问题上挣扎了一段时间,终于设法解决了,所以让我分享一下我的发现。
我一直在将应用程序从 iOS 移植到 Mac,项目本身是为 iOS 创建的,因此项目和主要目标在支持的平台上都有iOS 。 现在,当我开始移植时,我为 Mac 创建了新目标,并将支持的平台更改为仅针对该目标的 OSX。 之后我为单元测试创建了另一个目标,但忘记将支持的平台从 iOS 更改为 Mac。 我想您应该已经知道问题出在哪里,基本上单元测试目标默认情况下与 Cocoa 框架链接,所以由于该目标支持的平台只有 iOS,因此 Z1ED76D35F95379C2C1B160C2154C5C2 框架从未正确构建并且从未正确链接。 将测试目标的支持平台更改为 OSX 解决了该问题。
我知道这对 iOS 测试目标可能不是很有帮助,但至少 go 到您的测试目标 Link Binary With Libraries 部分,看看是否有任何红色库。 这给了我这个想法,也许它也会帮助你们中的一些人。
最近几次合并后我遇到了这个问题,我和一个同事都向项目中添加了文件,并不是所有的实现文件都是单元测试目标的成员。
解决方案:
.m
文件(使用“在导航器中过滤”(cmd-opt-j)搜索.m
) 注意:如果测试目标复选框显示-
而不是+
或未选中,则表示部分(但不是全部)选定文件是目标的成员。
我尝试在与.xcodeproj
的project.pbxproj
文件合并时做更智能的事情,但我每次都因为它的难以理解而放弃了挫败感,并转而使用这种方法。
(另一个说明:我一次只 select 几个文件,原因有两个:
确保测试目标将应用目标配置为依赖项(构建阶段 -> 目标依赖项)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.