Xcode:将全新框架链接到全新应用程序失败并显示“找不到图像”
Posted
技术标签:
【中文标题】Xcode:将全新框架链接到全新应用程序失败并显示“找不到图像”【英文标题】:Xcode: Linking brand new framework to brand new app fails with "image not found" 【发布时间】:2013-02-02 04:30:24 【问题描述】:我对 Xcode 和 Objective-C 完全陌生,但我是经验丰富的(网络)程序员。我想创建一个包含自制框架的应用。
现在我已经阅读了相当多的内容,我想我已经合理地掌握了 OS X 如何在运行时解决依赖关系,以及@rpath、@executable_path 和 @loader_path 的作用。
我做了以下创建框架:
-
创建名为 Test 的新 Cocoa 框架。
将安装目录设置为“@rpath”。
将“Test.h”添加到公共标头。
点击运行。
右键单击“产品”下的 Test.framework,选择在 Finder 中显示。它是项目“Debug”目录中一个名为“Test.framework”的目录。它似乎有合理的内容(Versions/A 目录和指向“Headers”、“Resources”和“Test”二进制文件的符号链接)
我执行以下操作来创建应用程序:
-
创建名为“TestApp”的新 Cocoa 应用。
将测试框架添加到项目。
选择“将文件添加到项目”。
从Test框架项目的“Release”目录中选择“Test.framework”目录。
选中“将项目复制到目标组的文件夹”
保留“为任何添加的文件夹创建组”。开。
确保将框架文件复制到应用程序包。
选择“添加构建阶段”->“添加复制文件”
将 Test.framework 文件夹(或组?)从侧边栏中拖到 Copy Files 区域。
添加一个名为“@executable_path/../Frameworks”的额外“框架搜索路径”
当我选择运行时,我在构建过程中收到以下警告:
构建目标TestApp
ld /Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp 正常 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/调试 -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:警告:找不到选项“-F@executable_path/../Frameworks”的目录
我可以想象这个警告是意料之中的,因为 Ld 可能根本不知道“@executable_path”。这是正确的吗?
随后,运行应用程序失败并显示:
dyld:库未加载:@rpath/Test.framework/Versions/A/Test 引用自:/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp 原因:找不到图片
奇怪的是,TestApp.app 包确实包含一个 Frameworks 目录,其中包含 Test.framework 目录。鉴于我对 OS X 如何搜索依赖项的了解,我认为我添加的搜索路径应该可以很好地解决。
这是在 XCode 4.6、OS X 10.8 上。
otool -L TestApp
给了
测试应用:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa(兼容版本1.0.0,当前版本19.0.0)
@rpath/Test.framework/Versions/A/Test(兼容版本1.0.0,当前版本1.0.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation(兼容版本 300.0.0,当前版本 945.11.0)
/usr/lib/libobjc.A.dylib(兼容版本1.0.0,当前版本228.0.0)
/usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本169.3.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit(兼容版本 45.0.0,当前版本 1187.33.0)
这里可以看到“@rpath”未展开吗?
我做错了什么?
【问题讨论】:
所以你确实将框架添加到复制阶段,所以它存在于包中,在运行时,在你的目标应用程序中,在派生数据文件夹中?我怀疑您添加的框架文件有问题。尝试删除它并再次将其添加到项目中。 好吧,在 /Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app(构建的东西)里面我有 Contents/Frameworks/ Test.framework ,其中包括指向“测试”二进制文件的符号链接等。我不确定您所说的“捆绑”是什么意思。捆绑包是否等同于应用程序“文件夹”?在 Finder 中,它显示“显示包内容”,所以我认为它被称为包。无论如何,我会尝试重新添加。谁知道。 :) 不高兴。还有什么我可以调查的吗?在此期间,我不介意了解一下 OS X(即它的开发基础架构)。例如,有没有办法检查“找不到图像”是否仅仅意味着“找不到文件”或者文件是否已损坏?我可以手动运行 dyld,将其应用于构建的应用程序“包”(或其中的应用程序二进制文件)吗? “dyld”是独立程序吗?我认为developer.apple.com/library/mac/#documentation/Darwin/Reference/… 建议是这样。然而,我的 PATH 中似乎没有 dyld。在我的系统上哪里可以找到它? 最有趣的事情可能是知道在这种情况下 dyld 将 "@rpath" 扩展为什么。如果它的输出更详细一点会有所帮助。 【参考方案1】:由于库标识符设置为以@rpath
为前缀的路径,链接到该库的应用程序需要指定一个或多个-rpath
选项,指示在搜索时dyld
应该用什么替换@rpath
变量运行时的库。如果您将框架复制到TestApp.app/Contents/Frameworks
,则典型值为@loader_path/../Frameworks
。您可以在您的 TestApp 目标上使用 Xcode 中的 LD_RUNPATH_SEARCH_PATHS
('Runpath Search Paths')配置设置来设置 -rpath
参数的值。
我可以想象这个警告是意料之中的,因为 Ld 可能根本不知道“@executable_path”。这是正确的吗?
将@executable_path/../Frameworks
添加到 Xcode 的框架搜索路径没有用处。框架搜索路径是静态链接器 (ld
) 的构建时概念,而 @executable_path
变量是动态链接器 (dyld
) 的运行时概念。
【讨论】:
哇,非常感谢。就是这样!我不知道我需要使用“运行路径搜索路径”(在“链接”下)而不是“框架搜索路径”(在“搜索路径”下)。抱歉这么晚才回复。我不知何故退出了,所以我错过了通知,也没有收到电子邮件通知。 我正在尝试在当前 xcode 中执行旧应用程序并开始出现烦人的 rpath 错误。我尝试了一切,但无法修复它。这就是我得到的:dyld:库未加载:@rpath/Sparkle.framework/Versions/A/Sparkle。我很欣赏一个灯棚。以上是关于Xcode:将全新框架链接到全新应用程序失败并显示“找不到图像”的主要内容,如果未能解决你的问题,请参考以下文章
由于架构不匹配,将静态库从 Xcode 链接到 Lazarus 应用程序失败