Xcode:将全新框架链接到全新应用程序失败,错误代码为 "image not found"

标签 xcode frameworks dyld

我对 Xcode 和 Objective-C 完全陌生,但在其他方面却是一位经验丰富的(网络)程序员。我想创建一个包含自制框架的应用程序。

现在我已经阅读了相当多的内容,我想我已经合理地掌握了 OS X 如何在运行时解决依赖关系,以及 @rpath、@executable_path 和 @loader_path 的作用。

我执行了以下操作来创建框架:

  1. 创建名为 Test 的新 Cocoa 框架。
  2. 将安装目录设置为“@rpath”。
  3. 将“Test.h”添加到公共(public) header 。
  4. 点击“运行”。
  5. 右键单击“产品”下的 Test.framework,选择“在 Finder 中显示”。它是项目“Debug”目录中名为“Test.framework”的目录。它似乎有合理的内容(版本/目录和“标题”、“资源”和“测试”二进制文件的符号链接(symbolic link))

我执行了以下操作来创建应用程序:

  1. 创建名为“TestApp”的新 Cocoa 应用。
  2. 将测试框架添加到项目中。 选择“将文件添加到项目”。 从测试框架项目的“Release”目录中选择“Test.framework”目录。 选中“将项目复制到目标组的文件夹” 保留“为任何添加的文件夹创建组”。上。
  3. 确保框架文件已复制到应用程序包中。 选择“添加构建阶段”->“添加副本文件” 将 Test.framework 文件夹(或组?)从侧边栏拖到“复制文件”区域。
  4. 添加一个名为“@executable_path/../Frameworks”的额外“框架搜索路径”

当我选择运行时,我在构建过程中收到以下警告:

Build target TestApp

Ld /Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp normal x86_64 cd /Users/meryn/Work/test-app/TestApp setenv MACOSX_DEPLOYMENT_TARGET 10.8 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -L/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug -F/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug -F/Users/meryn/Work/test-app/TestApp "-F@executable_path/../Frameworks" -filelist /Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Intermediates/TestApp.build/Debug/TestApp.build/Objects-normal/x86_64/TestApp.LinkFileList -mmacosx-version-min=10.8 -fobjc-arc -fobjc-link-runtime -framework Cocoa -framework Test -o /Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp

ld: warning: directory not found for option '-F@executable_path/../Frameworks'

我可以想象这个警告是可以预料的,因为 Ld 可能根本不知道“@executable_path”。这是正确的吗?

随后,运行应用程序失败并显示:

dyld: Library not loaded: @rpath/Test.framework/Versions/A/Test Referenced from: /Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp Reason: image not found

奇怪的是,TestApp.app 包确实包含一个 Frameworks 目录,其中包含 Test.framework 目录。根据我对 OS X 如何搜索依赖项的了解,我认为我添加的搜索路径应该可以很好地解析。

这是在 XCode 4.6、OS X 10.8 上。

otool -L TestApp 给出

TestApp:

/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)

@rpath/Test.framework/Versions/A/Test (compatibility version 1.0.0, current version 1.0.0)

/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 945.11.0)

/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1187.33.0)

这里可以看到“@rpath”未展开吗?

我做错了什么?

最佳答案

由于库标识符设置为以 @rpath 为前缀的路径,因此链接到库的应用程序需要指定一个或多个 -rpath 选项来指示在运行时搜索库时,>dyld 应替换 @rpath 变量。如果您要将框架复制到 TestApp.app/Contents/Frameworks,则典型值将为 @loader_path/../Frameworks。您可以使用 TestApp 目标上的 Xcode 中的 LD_RUNPATH_SEARCH_PATHS(“运行路径搜索路径”)配置设置来设置 -rpath 参数的值。

I can imagine this warning is to be expected, as Ld may not know about "@executable_path" at all. Is this correct?

@executable_path/../Frameworks 添加到 Xcode 的框架搜索路径没有用。框架搜索路径是静态链接器 (ld) 的构建时概念,而 @executable_path 变量是动态链接器 (dyld )。

关于Xcode:将全新框架链接到全新应用程序失败,错误代码为 "image not found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14924513/

相关文章:

objective-c - Xcode 4.3 - 预处理 plist 不再为 #define 和 "http://"工作?

iphone - 在Objective-C的IBAction期间显示文本

delphi - 关于创建类结构的想法

ios - 如何运行导致框架运行时错误的 iOS 应用程序 "code signature invalid"

ios - 为 Crashlytics 寻找 dsyms

python - Python 的通用测试自动化框架

python - 为什么我不能在 Django 中保存对象?

ios - Swift App 在模拟器上打开但在设备上不打开

c++ - 使用 DYLD interposing 来插入类函数

ios - 将 Xcode 5 降级到 Xcode 4.6 后仪器停止工作