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

时间:2013-02-17 18:29:33

标签: xcode frameworks dyld

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

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

我做了以下创建框架:

  1. 创建名为Test的新Cocoa Framework。
  2. 将安装目录设置为“@rpath”。
  3. 将“Test.h”添加到公共标题中。
  4. 点击运行。
  5. 右键单击“Products”下的Test.framework,选择Show in Finder。它是项目“Debug”目录中名为“Test.framework”的目录。它似乎有合理的内容(版本/ A目录和符号链接到“标题”,“资源”和“测试”二进制文件)
  6. 我做了以下操作来创建应用程序:

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

      当我选择运行时,我会在构建期间收到以下警告:

        

      构建目标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:警告:找不到选项'-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给出了

        

      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”未展开是否可以?

      我做错了什么?

1 个答案:

答案 0 :(得分:9)

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

  

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

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