2

1つのメインCocoaアプリケーション、多数のプラグイン、および2つのヘルパーアプリを含むプロジェクトがあります。ヘルパーアプリには独自のターゲットがあり、プラグインなしでアプリをビルドできるようにしたいので、メインアプリには独自のターゲット(AppTargetと呼びます)がありますが、通常はすべてを集約ターゲット(TargetAと呼びます)でビルドします。また、TargetAを備えた別の集約ターゲット、別のプラグイン、および追加のコピーファイルビルドフェーズ(TargetB)があります。これはすべて期待どおりに機能します。TargetAを含み、実行シェルスクリプトビルドフェーズがある(ただしまだない)新しい集約ターゲットTargetCを作成しようとしています。

私が遭遇している問題は、GCC_PREPROCESSOR_DEFINITIONSを使用して条件付きコンパイル(#ifdef TARGETC ... #endif)用のシンボルTARGETCを#defineしようとしているが、それがビルドパラメーターに含まれていないことです。ビルドログで、アプリの動作がビルドログと一致します-GCC_PREPROCESSOR_DEFINITIONSが失敗しました(TARGETCとTARGETC = 1の両方を試しました。OTHER_CFLAGSユーザー定義設定を追加しようとしました(-DTARGETC = 1に設定)が、それもうまくいきませんでした。

ドキュメントには、集約ターゲットのユーザー定義設定がサブターゲットに細流化すると記載されていますが、これは1レベルしか下がらないようです。TargetAはそれを取得している可能性がありますが、AppTargetはそうではありません。これはバグですか、予想される動作ですか、それとも私は何か間違ったことをしていますか?

4

1 に答える 1

0

私は答えを見つけました。これは予想される動作であり、さらに、集約ターゲットはユーザー設定をサブターゲットにまったく渡しません。ドキュメントが間違っているか、読み間違えました。これは、集約ターゲットで使用可能なデフォルトのユーザー設定としてGCC_PREPROCESSOR_DEFINITIONSを使用するという目的に反しているように見えますが、それは重要です。

必要な動作を実現するために、代わりに、新しい集計ターゲットに追加される別のプラグインを作成しています。私はシングルトンを使用してプラグインをロードしています。プラグインは、プラグインのプリンシパルクラス(と入力id <MyPluginProtocol>)への参照を保持します。これは、要求した人に返すことができます。ロードの試行が失敗した場合(プラグインが存在しないため)、nilが返されるためif (nil != [[PluginLoader sharedLoader] plugin])、の代わりになり#ifdef TARGETCます。これは、出荷コードのサイズを削減できないことを意味しますが、少なくともそれは機能します。とにかくプラグインに入る他のコードがあるので、無駄ではありません。

于 2011-05-28T00:24:45.120 に答える