21

オプションでクローズドソースフレームワークを使用できるオープンソースプロジェクトに取り組んでいます。クローズドソースフレームワークがプロジェクトに含まれている場合、追加機能があります。ただし、フレームワークがプロジェクトに含まれていない場合でも、プロジェクトは正しくコンパイルされるはずです。

フレームワークがプロジェクトに含まれているかどうかをコンパイル時に確認するにはどうすればよいですか?

基本的に、私はこのようなことをしたいと思います:

#ifdef _MY_FRAMEWORK_EXISTS
#import <MyFramework/MyFramework.h>
#endif

このような2年前の古い質問を見たことがありますが、答えが出ていないので、今は何か新しいものが欠けているかもしれません。

NSClassFromString()インポートしようとするとコンパイル時に失敗し、存在しないため、実行時にを介してチェックしたくMyFrameworkありません。

4

2 に答える 2

21

__has_include言語拡張子を使用して、ヘッダーファイルの存在を確認できます。 http://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros

ただし、これはヘッダーファイルがインストールされているかどうかのみを示します。「LinkBinaryWithLibraries」がそのフレームワークにリンクされているかどうかはわかりません。

于 2013-03-27T07:53:10.237 に答える
2

Mac Developer Library:Framework Programming Guide ( Weak Linkingのセクションが含まれています)を読むことをお勧めします。

  1. 「存在する」または「プロジェクトに含まれる」とはどういう意味ですか?「バイナリとライブラリのリンク」ビルドフェーズに追加されたことを意味しますか(フレームワークを含めるで説明されています)?行うのは、コンパイル、ビルドフェーズではなく、リンクに影響を与えることだけです。これを確認するには、ビルドします。-framework次に、 Xcodeのログナビゲータのビルドログで検索します。

    したがって、はい、提供したコードのコンパイルに影響を与えたい場合は、マクロを手動で定義できます_MY_FRAMEWORK_EXISTS

  2. 私はあなたが何をしようとしているのか本当に理解していません。より高いレベルであなたが欲しいものを説明できますか?おそらく、それを回避するためのより良い方法があります。

    「最小限のオーバーヘッド」は素晴らしいですが、あまりにも多くの魔法は混乱するかもしれません。たとえば、Xcodeの魔法は、フレームワークを含めるときに実際に何が起こるかを隠します。

    また、iOS用のFacebook SDKが、高レベルおよび低レベルのアイデアに対してどのように機能するかを確認することをお勧めします。それはあなたがやりたいようなことをするかもしれません。

于 2013-03-26T19:46:36.907 に答える