31

我已经为单元测试设置了一个 XCode 5 iOS 7 项目。

当然,设置单元测试花费了我很长时间,以至于我试图保持相信这是值得的。为这个错误挣扎了几个小时:

ld: building for iOS Simulator, but linking against dylib built for MacOSX file
'/Applications/Xcode5-DP5.app/Contents/Developer/Library/Frameworks/XCTest.framework/XCTest' 
for architecture i386

关于如何解决的任何想法?

4

11 回答 11

21

检查测试目标设置中的框架搜索路径。添加 XCTest 框架时,这些可能会损坏。

将 XCTest 添加到我的一个项目中会在路径前添加一个“/”,导致它们找不到正确的版本。

于 2013-09-21T13:10:12.417 回答
17

以上答案都不适合我。我确实在 Tim Macfarlane 留下的评论中找到了答案

对于在您的应用程序中寻找类的链接器错误...在您的应用程序目标中将“默认隐藏的符号”构建设置设置为“否”。这使您的所有应用程序类自动可用于您的测试目标......

所以,这意味着:

  • 项目导航器 > 选择您的项目
  • 目标 > 选择您的应用程序(不是测试)
  • 构建设置 > 搜索“默认隐藏的符号”
  • “默认隐藏符号”>将其从“是”更改为“否”
于 2014-06-24T15:28:40.937 回答
13

我遇到过同样的问题; 问题(至少对我而言)是构建设置在主要开发人员框架文件夹之后FRAMEWORKS_SEARCH_PATHS列出了 SDK 框架文件夹。

Xcode 包含的框架具有三个独立的构建:一个用于 OS X,一个用于 iOS(设备),第三个用于 iOS 模拟器。OS X 版本位于开发者主文件夹中,另外两个位于各自的平台文件夹下。这里的问题是,如果您没有指定首先搜索 SDK 文件夹(位于平台文件夹中),Xcode(或更准确地说,链接器)将首先找到 OS X 构建并产生您看到的错误。

解决方法很简单,放:

FRAMEWORK_SEARCH_PATHS = $(SDKROOT)/Developer/Library/Frameworks $(inherited)

在您的构建设置中。如果您将构建设置放在项目文件中(我不推荐它,但这是另一天的另一个问题),它只是命名为“框架搜索路径”。

注意:有时 Xcode 上手有点慢;您可能需要删除您的build文件夹(不仅仅是清理文件夹)才能生效。

于 2013-11-09T07:31:08.620 回答
6

将测试从 SenTestCase 转换为 XCTestCase 后遇到同样的问题。恢复框架目录已修复的问题:

"$(SDKROOT)/Developer/Library/Frameworks" (non-recursive)
"$(DEVELOPER_LIBRARY_DIR)/Frameworks" (non-recursive)
于 2013-12-06T12:32:21.003 回答
5

所以,对我来说,在尝试了这篇文章中的所有其他内容后,我所缺少的是:

其他链接器标志:

-framework XCTest

我目前正在使用 Xcode 6.0(带有 iOS 8 SDK),所以我很惊讶“编辑 > 重构 > 转换为 XCTest ...”选项不会自动添加它。

于 2014-09-21T00:41:49.477 回答
4

在 xcode 5 中添加 sentestingkit 框架时遇到问题。这些设置用于解决链接器问题。搜索路径

于 2014-04-09T10:10:29.257 回答
3

我在添加另一个文件进行测试时遇到了这个问题。如果您使用 (CMD + N) 执行此操作,请确保仅针对测试包(即“AppNameTests”)。

我猜只有这些 .xctest 包可以访问 XCTest 框架。

于 2013-08-25T04:52:11.187 回答
3

在重命名我的目标名称并移动内容后,我遇到了同样的问题。事实证明,我的测试是我的主要目标的一部分。确保您所有的测试文件只属于您的测试目标。

只需选择一个 .m 文件,确保您打开了右侧窗格。

XCode 测试目标图像

于 2014-05-16T20:51:18.070 回答
1

在尝试使用 7.0 之前的 SDK 构建基于 XCTTest 的单元测试时,我遇到了同样的问题。当我选择 7.0 作为我的基础 SDK 时,那种链接错误就消失了。

于 2013-10-09T08:44:19.810 回答
1

有同样的问题,但最终得到了一个稍微不同的解决方案。

选择 XCTest.framework 并确保在 Target Membership 下仅选中您的测试文件夹。

目标会员

于 2014-08-03T00:55:29.570 回答
0

确保目标的 Search Framework Path( FRAMEWORK_SEARCH_PATHS)YourProjectTests包含该路径$(SDKROOT)/Developer/Library/Frameworks,并且该路径已在之前列出$(inherited)

就我而言,两条路径都存在,但是$(inherited)第一条。

Apple Mach-O 链接器(id)警告上 的https://stackoverflow.com/users/181947/brian-clear :为 MacOSX 构建,但与为 iOS 构建的 dylib 链接

于 2014-04-03T08:05:31.307 回答