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 回答