在一个库中声明变量或函数,并在另一个库中定义它

时间:2013-01-28 20:27:44

标签: objective-c c frameworks forward-declaration

我在我的所有应用中都使用了一个库,其中包含常用代码。我把它编译为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头文件一起使用,该文件的值可以在该项目中编辑并由库使用? < / p>

2 个答案:

答案 0 :(得分:2)

可能的方法是在库中有一个setAppID方法,应用程序必须调用它才能设置ID。

也就是说,kAppID是图书馆的一部分:

static NSString* kAppID = nil;

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

// ...library can use kAppID as necessary...

答案 1 :(得分:2)

extern是正确的方法。

在你的lib中

extern NSString* const kAppID;

项目中的某个地方:

NSString* const kAppID = @"ABCD1234";

在你的lib中使用Singleton对象你可以从你的项目配置是一个更好的方法。但是如果你想让链接器在没有设置的情况下崩溃,那么使用extern是正确的方法。