4

私は Xcode と Objective-C はまったく初めてですが、それ以外は経験豊富な (Web) プログラマーです。自作のフレームワークを含むアプリを作りたいです。

OS X が実行時にどのように依存関係を解決するか、@rpath、@executable_path、および @loader_path の役割についてかなり理解できたと思います。

フレームワークを作成するために次のことを行いました。

  1. Test という名前の新しい Cocoa フレームワークを作成します。
  2. インストール ディレクトリを "@rpath" に設定します。
  3. パブリック ヘッダーに「Test.h」を追加します。
  4. [実行] をクリックします。
  5. "Products" の下の Test.framework を右クリックし、[Show in Finder] を選択します。プロジェクトの「Debug」ディレクトリにある「Test.framework」というディレクトリです。妥当な内容 (Versions/A ディレクトリと、"Headers"、"Resources"、および "Test" バイナリへのシンボリック リンク) があるようです。

アプリを作成するために次のことを行いました。

  1. 「TestApp」という名前の新しい Cocoa アプリを作成します。
  2. プロジェクトにテスト フレームワークを追加します。「ファイルをプロジェクトに追加」を選択します。テスト フレームワーク プロジェクトの「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 通常の 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

ライブラリ識別子はプレフィックス付きのパスに設定されているため、ライブラリにリンクするアプリケーションは、実行時にライブラリを検索するときに、変数を何に置き換えるかを示す@rpath1 つ以上-rpathのオプションを指定する必要があります。典型的な値は、フレームワークを にコピーする場合です。TestApp ターゲットの Xcode で ('Runpath Search Paths') 構成設定を使用して、引数の値を設定できます。dyld@rpath@loader_path/../FrameworksTestApp.app/Contents/Frameworks-rpathLD_RUNPATH_SEARCH_PATHS

Ld は「@executable_path」についてまったく知らない可能性があるため、この警告が予想されることは想像できます。これは正しいです?

@executable_path/../FrameworksXcode のフレームワーク検索パスに追加しても役に立ちません。フレームワークの検索パスは静的リンカーのビルド時の概念 ( ld) であり、@executable_path変数は動的リンカーの実行時の概念 ( dyld) です。

于 2013-02-27T07:32:43.960 に答える