Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 构建单元测试目标时发生链接错误_Unit Testing_Xcode4_Linker Errors_Ocunit - Fatal编程技术网

Unit testing 构建单元测试目标时发生链接错误

Unit testing 构建单元测试目标时发生链接错误,unit-testing,xcode4,linker-errors,ocunit,Unit Testing,Xcode4,Linker Errors,Ocunit,我有一个带有常规目标和单元测试目标的XCode4/iOS项目。一切正常,除了我尝试在测试类中导入一个类并尝试使用它时。如果我尝试构建单元测试目标,则会出现以下链接错误: Undefined symbols for architecture i386: "_OBJC_CLASS_$_FRRCategory", referenced from: objc-class-ref in CategoryTests.o ld: symbol(s) not found for architec

我有一个带有常规目标和单元测试目标的XCode4/iOS项目。一切正常,除了我尝试在测试类中导入一个类并尝试使用它时。如果我尝试构建单元测试目标,则会出现以下链接错误:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_FRRCategory", referenced from:
      objc-class-ref in CategoryTests.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
在CategoryTests.m中,我以以下方式导入头文件:

#import "../todoro/FRRCategory.h"

我做错了什么?

确保FRRCategory源文件已添加到单元测试目标的编译源中

代码4:


Project Navigator->[Project Name]->在目标下选择单元测试目标->构建阶段->展开编译源->单击编译源底部的+并添加正确的源文件。

如果文件位于框架内,则只应参考导入中的文件夹。否则,将文件添加到项目后,只需导入FRRCategory.h即可。除非你对标题搜索路径做了一些奇怪的操作。

按照说明操作。它不需要您添加任何文件来编译源代码

我首先忽略了默认情况下隐藏的符号=否应该是应用程序目标,而不是测试目标


不管怎样,它对我很有效。另一个你可能遇到的问题是,你的单元测试使用的是C函数或类似的函数,而这些函数并没有在实际的应用程序中使用

这可能仅限于有一个子项目。就我而言

应用程序 子项目 一个嵌入C库,即直接在其中编译的.C和.h文件 我的单元测试使用了一些其他地方没有使用的C函数,这些函数是从应用程序二进制文件中剥离出来的,而不是从子项目的.a文件中剥离出来的

解决办法是

关闭应用程序调试版本的死代码剥离。*和 确保单元测试在方案设置中使用的是调试而不是发布。
*不要对版本配置执行此操作,因为它会使用从未调用过的代码使应用程序膨胀。

将文件添加到编译源中会删除错误。这些编译源是什么?强制您从主目标手动添加文件的理由是什么?每个目标使用一组独立的源文件。要么您没有将测试目标创建为主目标的副本,要么在创建FRRCategory期间您没有选择两个目标。这取决于您使用的单元测试框架。您是在使用Xcode 4附带的SentTestingKit还是其他什么…如果您使用的是SenTestingKit,则不希望将测试中的代码添加到测试目标中。编译源是您需要为目标编译的所有实现文件。当您有多个目标时,每个目标都维护自己的一组编译源,当您向项目添加新的或现有的文件时,您应该看到一个复选框选项,该新文件应该包含在哪些目标中。这包括图像、界面以及代码等资源。这不是此问题的正确答案。请检查下面的答案。它没有删除错误,但我不知道不需要包含该文件夹。谢谢您的常规目标是应用程序还是静态库?这是大多数人希望遵循的答案,而不是提问者检查的答案。通过这种方式,应用程序构建产品的构建类似于独立使用的构建,并且测试与之链接。另一种方法是复制所有构建设置、链接器设置等,以使用单元测试单独构建源代码。Lol,即使在阅读了您的评论之后,我仍然搞砸了,需要在我的应用程序目标(而不是测试目标)上默认隐藏的符号=否+这确实是唯一正确的答案。其他答案将源代码的两个副本编译成实例化的测试包。虽然一般来说这是可以的,但如果构建工具链中有bug,您会感到非常奇怪,并且很难调试副作用。默认情况下隐藏的符号=调试模式为否解决了问题,即使对于我新添加的测试目标的X-Code 6.3也是如此。谢谢。这个解决方案似乎不适用于扩展单元测试,这里有更多的解决方案:当尝试在设备架构arm64上运行单元测试时,这就是问题所在。谢谢