2017-03-02 14 views
1

私はフレームワークAで使用する静的フレームワークBを持っています。BはクラスAを持っています。これはAで公開したい、つまり以下のイラストです。クラス。静的フレームワークで使用されるヘッダーを公開する

アプリケーション>フレームワークA>静的フレームワークB>クラスC

私はAの公開ヘッダにCのヘッダーを含めるようにしようとすると、私は「重複したインタフェースの定義」を取得します。しかし、コードがBからAにコンパイルされるので、私はクラスインタフェースを公開する必要があります - おそらくそれは、アプリケーションが正しくリンクすることができます...?

+0

BとCをインポートするために、ヘッダーを作成し、A? – antonio081014

+0

私はヘッダーを細かくインポートすることができます。それは、問題を引き起こしているAでパブリックにしています。 – Nick

答えて

0

私はこれを回避策で実現しました。

静的ライブラリ/フレームワークを別のフレームワーク/静的ライブラリにコンパイルすると、そのシンボルは引き続き公開されます(nm <binary> | grep <symbol>を確認してください)。つまり、フレームワークAのクラスCのヘッダーを含めて、それらのシンボルについて知るには、アプリケーションコードが必要です。

フレームワークAのヘッダーには、クラスCヘッダーを含める必要があります。フレームワークをコンパイルするときは、"ClassC.h"を使用する必要がありますが、フレームワークを使用しているときは、アプリケーションに含まれているフレームワーク内の場所である<FrameworkName/ClassC.h>が必要です。これを行うには、スクリプト実行段階で削除されたマクロを使用します。

だから、あなたの枠組みの中で、ターゲットのビルドフェーズは、クラスCのためのあなたのヘッダーはその後、「スクリプトの実行」段階を追加し、以下を貼り付け、コピーヘッダ段階の「公共」セクションにあることを確認します

TARGET_MACRO="TARGET_FRAMEWORK" 
cd -P "$BUILT_PRODUCTS_DIR/$WRAPPER_NAME/Headers/" 
perl -0pi -e "s/\#if ${TARGET_MACRO}.*?\#else\r?\n?(.*?)\r?\n?\#endif/\1/sg" *.h 

変更 `TARGET_FRAMEWORK」何、またはそれを残すことにする。

フレームワークAでは、すべてのためのTARGET_FRAMEWORK=1は構成を構築する追加、プリプロセッサマクロの下で、設定を構築する。

その後、含まあなたのフレームワークAのヘッダにクラスC:を使用してください:

関連する問題