6

当我从命令行运行 iPhone 应用程序时,将框架添加到我的项目时遇到了一些困难。我的最终目标是从自动化构建过程中运行应用程序测试。

当我从 xCode 运行我的应用程序时:

我向目标添加了“复制文件”构建阶段,一切正常。副本设置为 $(BUILT_PRODUCTS_DIR) 作为“绝对路径”

当我从终端运行我的应用程序(使用 iphonesim 项目)时,我收到此错误:

 dyld: Library not loaded: @rpath/OCMock.framework/Versions/A/OCMock

 UIKitApplication:indemnisation[0xb894][26380]     Referenced from: /Users/Admin/Library/Application Support/iPhone Simulator/User/Applications/CD5729B5-A674-49B2-91F6-AD398094B6F8/indemINT.app/indemINT

我不明白的是,复制构建阶段只是将框架文件复制到与应用程序相同的目录中。

当我从命令行运行应用程序时,框架文件已经在同一目录中。有谁知道为什么它不起作用?

我还尝试在以下目录中添加 OCMock.framework(没有成功):

 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library

 /Library/Frameworks

 /Users/Admin/Library/Application Support/iPhone Simulator/User/Applications/CD5729B5-A674-49B2-91F6-AD398094B6F8

在此先感谢文森特。

4

3 回答 3

8

我刚刚在 Lion 上的 Xcode 4.2 (4D199) 中遇到了同样的错误。我将 OCMock.framework 文件夹拖放到我的项目中并选中了“复制文件”复选框。我看到了上面的答案并意识到我忽略了添加“复制文件”构建阶段来将框架移动到位。我添加了一个并在编译文件构建阶段之后立即将其拖动并尝试再次运行我的测试。在将“复制文件”阶段的目标更改为“产品目录”之前,我无法让它工作。使用“框架”或“共享框架”不起作用。

于 2011-12-18T03:23:24.770 回答
2

iPhone 不支持传统的 Mac OS X 框架。虽然 iPhone 确实使用以“.framework”结尾的文件夹,但这些文件夹的结构与典型的 Mac OS X 框架不同。最值得注意的是,iPhone 框架只允许使用静态库,而典型的 Mac OS X 框架是动态加载的。来自 dyld 的消息表明您正在使用共享库;然而,以 iPhone 为目标的应用程序只能静态链接。

于 2010-03-18T17:47:28.837 回答
0

OCMock 是作为框架分发的,iPhone 不允许您构建自己的任意框架(有充分的理由在只有 128MB RAM 且没有交换的设备上执行此操作)。

我在网上很多地方看到的解决方案是将 OCMock.framework 放在 /Library/Frameworks 或标准框架搜索路径中的任何其他位置。这不是一个很好的解决方案:您的构建系统现在取决于您的特定机器的状态。不好。

另一种选择是将 OCMock 的源添加到您的单元测试目标中。这可行但没有必要,因为您的测试永远不会在 iPhone 上运行,2 那么为什么还要为 ARM 构建它们呢?为 iPhone 模拟器构建的可执行文件是 Mac OS X 二进制文件,可以很好地链接到动态库。我们可以利用它来发挥我们的优势。

以下是我认为让 OCMock 与 iPhone 项目一起工作的最佳方式:

首先,将 OCMock.framework 添加到您的项目中。确保它被添加到您的单元测试目标中,而不是您的应用程序中。

接下来,将 Copy Files 阶段添加到您的单元测试目标。像这样设置它:

目的地:绝对路径完整路径:$(BUILT_PRODUCTS_DIR)

现在,将 OCMock.framework 拖到新的 Copy Files 阶段,将其添加到要复制的文件列表中。

最后,在 Compile Sources 和 Link Binary With Libraries 阶段之间拖动 Copy Files 阶段,我将其重命名为“Copy OCMock”。

而已!运行(我的意思是构建)你的测试,一切都应该正常工作。

于 2012-02-24T06:10:28.033 回答