Xcode:将全新框架链接到全新的应用程序失败并显示“未找到图像”

Xcode:将全新框架链接到全新的应用程序失败并显示“未找到图像”,第1张

概述我是 Xcode和Objective-C的新手,但是他是一位经验丰富的(网络)程序员.我想创建一个包含自制框架的应用程序. 现在我已经阅读了很多内容,我想我已经合理地掌握了OS X如何在运行时解析依赖关系,以及@rpath,@ executable_path和@loader_path的角色. 我做了以下创建框架: >创建名为Test的新Cocoa Framework. >将安装目录设置为“@rpa 我是 Xcode和Objective-C的新手,但是他是一位经验丰富的(网络)程序员.我想创建一个包含自制框架的应用程序.

现在我已经阅读了很多内容,我想我已经合理地掌握了OS X如何在运行时解析依赖关系,以及@rpath,@ executable_path和@loader_path的角色.

我做了以下创建框架:

>创建名为Test的新Cocoa Framework.
>将安装目录设置为“@rpath”.
>将“Test.h”添加到公共标题中.
>点击运行.
>右键单击“Products”下的Test.framework,选择Show in Finder.它是项目“DeBUG”目录中名为“Test.framework”的目录.它似乎有合理的内容(版本/ A目录和符号链接到“标题”,“资源”和“测试”二进制文件)

我做了以下创建应用程序:

>创建名为“TestApp”的新Cocoa应用程序.
>将测试框架添加到项目中.
选择“将文件添加到项目”.
从Test框架项目的“Release”目录中选择“Test.framework”目录.
选中“将项目复制到目标组的文件夹”
保留“为任何添加的文件夹创建组”.上.
>确保将框架文件复制到应用程序包.
选择“添加构建阶段” – > “添加复制文件”
将Test.framework文件夹(或组?)从侧边栏拖动到“复制文件”区域.
>添加一个名为“@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:将全新框架链接到全新的应用程序失败并显示“未找到图像”全部内容,希望文章能够帮你解决Xcode:将全新框架链接到全新的应用程序失败并显示“未找到图像”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1030093.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存