私のセットアップ:
Mac OS X 10.7.4
Xcode 4.3.2
組み込みの Cocoa Loadable Bundle をロードしてプラグインとして使用する Mac OS X アプリケーションがあります。プラグインは.app
、標準の場所 ( ) にある Mac アプリのバンドルに含まれMyApp.app/Contents/PlugIns
ており、標準の Cocoa NSBundle
API を介してロードされます。プラグインは、宛先が に設定された標準の「ファイルのコピー」ビルド フェーズで、最終的な 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 アプリ ターゲットに次のビルド設定を設定しました。
コピー中にデバッグ シンボルを削除する: いいえ(デバッグとリリースの両方の場合)
デフォルトで非表示のシンボル: いいえ(デバッグとリリースの両方の場合)