2

すべてのアプリで使用するライブラリがあり、共通のコードが含まれています。Macの場合は「フレームワーク」、iOSの場合は「静的ライブラリ」としてコンパイルします。

ファイナルインクルードプロジェクトで定義された変数をライブラリが参照できるようにしたいと思います。

たとえば、ライブラリには次の関数があります。

void printAppID(void);

void printAppID(void) {
    NSLog(@"App ID is: %@", kAppID);
}

当然、この変数が宣言されていない場合、ライブラリは警告をスローするため、次のように宣言しました。

NSString *kAppID;

また、kAppID 事前にライブラリに認識されていないため(プロジェクトごとに異なります)、最終的なプロジェクトは次のようになります。

NSString *kAppID = @"ABCD1234"

これにより、コンパイラエラーがスローされます。

アーキテクチャの未定義のシンボル

を使ってみexternたり、関数にしたりしてみました#defineが、これを割ることはできません。

ライブラリ内で変数を宣言し、それを別の場所で定義する標準的な方法は何ですか?これはCでもObj-Cでも同じだと思います。

編集:より一般化されたケース

アプリプロジェクトにConstants.hヘッダーファイルと一緒にインクルードされたコンパイル済み静的ライブラリを作成するにはどうすればよいですか?その値はそのプロジェクトで編集してライブラリで使用できますか?

4

2 に答える 2

2

標準的な方法は、おそらくsetAppIDライブラリのどこかにメソッドを用意することです。このメソッドは、ID を設定するためにアプリによって呼び出される必要があります。

つまり、これはkAppIDライブラリの一部です。

static NSString* kAppID = nil;

void setAppID (NSString* appID) {
    kAppID = appID;
}

// ...library can use kAppID as necessary...
于 2013-01-28T20:57:25.547 に答える
2

extern が正しい方法です。

あなたのライブラリで:

extern NSString* const kAppID;

あなたのプロジェクトのどこかに:

NSString* const kAppID = @"ABCD1234";

プロジェクトから構成できるライブラリでシングルトンオブジェクトを使用することは、おそらくより良い方法です。ただし、何かが設定されていない場合にリンカをクラッシュさせたい場合は、 extern を使用するのが正しい方法です。

于 2013-01-28T20:57:41.660 に答える