私は Xcode と Objective-C はまったく初めてですが、それ以外は経験豊富な (Web) プログラマーです。自作のフレームワークを含むアプリを作りたいです。
OS X が実行時にどのように依存関係を解決するか、@rpath、@executable_path、および @loader_path の役割についてかなり理解できたと思います。
フレームワークを作成するために次のことを行いました。
- Test という名前の新しい Cocoa フレームワークを作成します。
- インストール ディレクトリを "@rpath" に設定します。
- パブリック ヘッダーに「Test.h」を追加します。
- [実行] をクリックします。
- "Products" の下の Test.framework を右クリックし、[Show in Finder] を選択します。プロジェクトの「Debug」ディレクトリにある「Test.framework」というディレクトリです。妥当な内容 (Versions/A ディレクトリと、"Headers"、"Resources"、および "Test" バイナリへのシンボリック リンク) があるようです。
アプリを作成するために次のことを行いました。
- 「TestApp」という名前の新しい Cocoa アプリを作成します。
- プロジェクトにテスト フレームワークを追加します。「ファイルをプロジェクトに追加」を選択します。テスト フレームワーク プロジェクトの「Release」ディレクトリから「Test.framework」ディレクトリを選択します。「コピー先グループのフォルダーにアイテムをコピーする」がチェックされている 「追加されたフォルダーのグループを作成する」のままにします。の上。
- フレームワーク ファイルがアプリケーション バンドルにコピーされていることを確認します。[ビルド フェーズの追加] -> [コピー ファイルの追加] を選択し、Test.framework フォルダー (またはグループ?) をサイドバーから [ファイルのコピー] 領域にドラッグします。
- 「@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」が展開されていなくても大丈夫ですか?
私は何を間違っていますか?