簡體   English   中英

在一個庫中聲明變量或函數,然后在另一個庫中定義

[英]Declare a variable or function in one library and define it in another

我的所有應用程序中都有一個庫,其中包含通用代碼。 我將其編譯為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頭文件,該文件的值可以在該項目中進行編輯並由該庫使用?

規范的方法可能是在庫中某處有一個setAppID方法,該方法必須由應用程序調用以設置ID。

也就是說, kAppID是庫的一部分:

static NSString* kAppID = nil;

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

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

extern是正確的方法。

在您的lib中:

extern NSString* const kAppID;

項目中的某處:

NSString* const kAppID = @"ABCD1234";

在您的lib中使用Singleton Object,可以從您的項目進行配置可能是一種更好的方法。 但是,如果您希望鏈接器在未設置任何內容的情況下崩潰,則使用extern是正確的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM