3

私のセットアップ:

Mac OS X 10.7.4
Xcode 4.3.2

組み込みの Cocoa Loadable Bundle をロードしてプラグインとして使用する Mac OS X アプリケーションがあります。プラグインは.app、標準の場所 ( ) にある Mac アプリのバンドルに含まれMyApp.app/Contents/PlugInsており、標準の Cocoa NSBundleAPI を介してロードされます。プラグインは、宛先が に設定された標準の「ファイルのコピー」ビルド フェーズで、最終的な Mac アプリ バンドルにコピーされPlugInsます。これは、Mac アプリの標準的な Cocoa プラグイン セットアップと言えます。

ただし、少し変わっていることが 1 つあります。-bundle_loaderビルド時にメイン アプリのパブリック シンボルに対してプラグイン バンドルをリンクするオプションを使用しています。私はもともとこれを Xcode 3 でセットアップしましたが、常に正常に機能しています。

Xcodeの説明は次の-bundle_loaderとおりです。

Bundle Loader
BUNDLE_LOADER
Specifies the executable that will be loading the bundle output file being linked. Undefined symbols from the bundle are checked against the specified executable like it was one of the dynamic libraries the bundle was linked with. [BUNDLE_LOADER, -bundle_loader]

Xcode 4 でも、デバッグビルド構成とリリースビルド構成の両方で、Mac アプリを正常にビルドして実行できます。問題ない。(これを行うには、デフォルトの実行アクションのビルド構成をデバッグまたはリリースに設定します)。どちらの構成も問題なくビルドおよび実行されます。

ここに私の問題があります: Xcode 4 では、Mac アプリを正常にアーカイブできません。プラグイン バンドルは、リンク時 (ビルド プロセスでのコンパイル直後) にメインのアプリ実行可能ファイルにリンクしません。

私のアーカイブ アクションは、リリースビルド構成を使用してビルドするように設定されています (もちろん)。前述したように、実行アクションを使用したリリース ビルド構成でのビルドに問題はありません。この問題は、アーカイブアクションの実行時にのみ発生します。

アーカイブしようとすると、次のリンク エラーが表示されます (これは、最初のプラグイン バンドルのソースをコンパイルした直後に発生します)。

Ld /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/InstallationBuildProductsLocation/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/Fake.app/Contents/PlugIns/Tabs.fluidplugin/Contents/MacOS/Tabs normal x86_64
    cd /Volumes/SystemY/Users/<myusername>/work/fluidium/trunk/Fluidium
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -bundle -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk -L/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release -F/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release -filelist /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/IntermediateBuildFilesPath/Fluidium.build/Release/TabsPlugIn.build/Objects-normal/x86_64/Tabs.LinkFileList -mmacosx-version-min=10.6 -bundle_loader /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/FluidApp.app/Contents/MacOS/FluidApp /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/TDAppKit.framework/TDAppKit -framework Quartz -framework WebKit -framework Cocoa -o /Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/InstallationBuildProductsLocation/Users/<myusername>/Library/Developer/Xcode/DerivedData/Fluidium-ajljctlwoiqpcodskkcwxrxngeyo/Build/Intermediates/ArchiveIntermediates/Fake/BuildProductsPath/Release/Fake.app/Contents/PlugIns/Tabs.fluidplugin/Contents/MacOS/Tabs

Undefined symbols for architecture x86_64:
  "_OBJC_IVAR_$_FUPlugIn.aboutInfoDictionary", referenced from:
      -[FUTabsPlugIn aboutInfoDictionary] in FUTabsPlugIn.o
  "_OBJC_CLASS_$_FUPlugIn", referenced from:
      _OBJC_CLASS_$_FUTabsPlugIn in FUTabsPlugIn.o
  "_OBJC_METACLASS_$_FUPlugIn", referenced from:
      _OBJC_METACLASS_$_FUTabsPlugIn in FUTabsPlugIn.o
  "_FUTabControllerProgressDidStartNotification", referenced from:
      -[FUTabsViewController startObserveringTabController:] in FUTabsViewController.o
      -[FUTabsViewController stopObserveringTabController:] in FUTabsViewController.o
  "_FUTabControllerProgressDidChangeNotification", referenced from:
      -[FUTabsViewController startObserveringTabController:] in FUTabsViewController.o
      -[FUTabsViewController stopObserveringTabController:] in FUTabsViewController.o
  "_FUTabControllerProgressDidFinishNotification", referenced from:
      -[FUTabsViewController startObserveringTabController:] in FUTabsViewController.o
      -[FUTabsViewController stopObserveringTabController:] in FUTabsViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

最後に 1 つ: 「バンドル ローダー」として機能する Mac アプリ ターゲットに次のビルド設定を設定しました。

コピー中にデバッグ シンボルを削除する: いいえ(デバッグとリリースの両方の場合)
デフォルトで非表示のシンボル: いいえ(デバッグとリリースの両方の場合)

4

2 に答える 2

2

解決しました!

リリース用にビルドするとき、メインのアプリ ターゲットで実行される「ストリップ」フェーズはありませんでした。ただし、アーカイブ時に、メインのアプリ ターゲットで実行される「ストリップ」フェーズがありました。(どちらも Release Build Configuration を介してビルドしているため、これが異なる理由はわかりませんが、そうです)。

アーカイブ時のストリップ フェーズが原因で、プラグインを bundle_loader 経由でリンクできませんでした。シンボルはメイン アプリのバイナリから削除されていました。

解決策は、メイン アプリ (バンドル ローダーとして機能するアプリ) のビルド設定で次の設定を設定することでした。

ストリップ スタイル: デバッグ シンボル

于 2012-05-12T19:01:15.077 に答える
1

これを試してください: スキームのビルド設定で Find Implicit Dependencies と Parallelize Build を無効にします。そして、プラグインをそのターゲット リストに追加します。正しくビルドされていることを確認してから、アーカイブの問題が修正されているかどうかを確認してください。

于 2012-05-12T16:46:42.790 に答える