Xcode:将全新框架链接到全新应用程序失败,返回“0”;“未找到图像”;

Xcode:将全新框架链接到全新应用程序失败,返回“0”;“未找到图像”;,xcode,frameworks,dyld,Xcode,Frameworks,Dyld,我对Xcode和Objective-C完全不熟悉,但我是一个经验丰富的(web)程序员。我想创建一个包含自制框架的应用程序 现在我已经读了很多关于它的书,我想我已经对OSX如何在运行时解析依赖关系,以及@rpath、@executable\u path和@loader\u path的角色有了合理的理解 为了创建框架,我做了以下工作: 创建名为Test的新Cocoa框架 将安装目录设置为“@rpath” 将“Test.h”添加到公共标题中 单击运行 右键单击“产品”下的Test.framework

我对Xcode和Objective-C完全不熟悉,但我是一个经验丰富的(web)程序员。我想创建一个包含自制框架的应用程序

现在我已经读了很多关于它的书,我想我已经对OSX如何在运行时解析依赖关系,以及@rpath、@executable\u path和@loader\u path的角色有了合理的理解

为了创建框架,我做了以下工作:

  • 创建名为Test的新Cocoa框架
  • 将安装目录设置为“@rpath”
  • 将“Test.h”添加到公共标题中
  • 单击运行
  • 右键单击“产品”下的Test.framework,选择ShowinFinder。它是一个名为“Test.framework”的目录,位于项目的“Debug”目录中。它似乎有合理的内容(Versions/A目录和指向“Headers”、“Resources”和“Test”二进制文件的符号链接)
  • 我执行了以下操作来创建应用程序:

  • 创建名为“TestApp”的新Cocoa应用程序
  • 将测试框架添加到项目中。 选择“将文件添加到项目”。 从测试框架项目的“发布”目录中选择“Test.framework”目录。 选中“将项目复制到目标组的文件夹” 将“为任何添加的文件夹创建组”保留在打开状态
  • 确保将框架文件复制到应用程序包。 选择“添加构建阶段”->“添加复制文件” 将Test.framework文件夹(或组?)从侧栏拖到“复制文件”区域
  • 添加一个名为“@executable\u path/./Frameworks”的额外“框架搜索路径”
  • 当我选择run时,在生成过程中会收到以下警告:

    构建目标TestApp

    Ld/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp ajwvknoonliuqfqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp normal x86_64 cd/Users/meryn/Work/test app/TestApp setenv MACOSX_部署_目标10.8 /Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xctoolschain/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 ajwvknonliuqfxacxrmapyfz/Build/Products/Debug-F/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp ajwvknoonliuqfaqxacxrmapyfz/Build/Products/Debug-F/Users/meryn/Work/test app/TestApp”-F@executable_path/../Frameworks“-filelist/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknonliuqfqfaqxacxrmapyfz/Build/Intermediates/TestApp.Build/Debug/TestApp.Build/Objects-normal/x86_64/TestApp.LinkFileList-mmacosx-version=10.8-fobjc-arc-fobjc-link-runtime-framework-coa-framework-Test-o/用户/meryn/Library/Developer/Xcode/DerivedData/TestApp ajwvknoonliuqfqfaqxacxrmapyfz/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 ajwvknoonliuqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp 原因:找不到图像

    奇怪的是TestApp.app包确实包含一个Frameworks目录,其中包含Test.framework目录。考虑到我对OSX如何搜索依赖项的理解,我认为我添加的搜索路径应该可以很好地解决这个问题

    这是在XCode 4.6、OSX10.8上实现的

    otool-L TestApp

    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”吗


    我做错了什么?

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

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


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

    因此您确实将框架添加到了复制阶段,因此它在运行时存在于目标应用程序中的捆绑包中,哪个在派生数据文件夹中?我怀疑您添加的框架文件有问题。尝试删除它并再次将其添加到项目中