dyld:库未加载 - 当应用程序从命令行运行时

时间:2010-03-18 17:35:49

标签: iphone dyld

当我从命令行运行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

提前致谢, 文森特。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

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

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

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

接下来,将Copy Files阶段添加到Unit Tests目标。设置如下:

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

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

最后,在“编译源”和“链接二进制库”阶段之间拖动“复制文件”阶段,我将其重命名为“复制OCMock”。

就是这样!运行(并通过运行我的意思是构建)您的测试,一切都应该正常工作。