4

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

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

我做了以下创建框架:

  1. 创建名为 Test 的新 Cocoa 框架。
  2. 将安装目录设置为“@rpath”。
  3. 将“Test.h”添加到公共标头。
  4. 点击运行。
  5. 右键单击“产品”下的 Test.framework,选择在 Finder 中显示。它是项目“Debug”目录中一个名为“Test.framework”的目录。它似乎有合理的内容(Versions/A 目录和指向“Headers”、“Resources”和“Test”二进制文件的符号链接)

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

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

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

构建目标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

测试应用:

/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”未扩展吗?

我究竟做错了什么?

4

1 回答 1

9

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

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

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

于 2013-02-27T07:32:43.960 回答