2010-06-25 55 views
5

我已經構建了一個靜態庫,以便在我的iPhone應用程序中進行鏈接。這個庫使用了一些全局變量和函數,就像在C.我的問題是,例如使用時:靜態庫中的extern變量,使用Objective-C

extern 
void do_stuff (const int a) 
{ 
    return a*a; 
} 

extern const int a_variable; 
extern const int an_array[DEFINED_VALUE]; 

當我使用這個功能,或者訪問這些變量,在我的代碼的任何地方,編譯器告訴我

「_do_stuff」 從引用: - [對象TestMethod的]在tests.o

「_a_variable」 從引用: - 在從參考tests.o

「_an_array」[對象TestMethod的]: - [對象TestMethod的]在tests.o

圖形符號沒有找到 Collect2:身份證返回

有沒有人之前遇到過這個問題1退出狀態

?我知道我在做一些愚蠢的事情,我錯過了一些關鍵的Objective-C或C概念,但是我看不出什麼。所以我希望有人能幫助我。提前致謝。

回答

5

這些是鏈接器錯誤,告訴您無法找到引用的實體。這可能意味着你沒有將你的庫添加到項目中。

順便說一句,你應該,你聲明這些東西,他們的確應該被宣佈爲extern的地方,在那裏你定義他們,他們不應該是地方加以區分。也就是說,你可能有包含頭文件:

extern void do_stuff (const int a); 
extern const int a_variable; 
extern const int an_array[]; 

有類似然後實現文件:

void do_stuff (const int a) 
{ 
    return a*a; 
} 

const int a_variable = 42; 
const int an_array[DEFINED_VALUE] = { 1, 2, 3, 4 }; 

至於另一一邊,叫什麼a_variable時,它實際上是一個const是有點誤導!

+0

我嘗試了與目標應用程序鏈接的庫,然後根據庫目標嘗試了目標應用程序。兩者都產生相同的錯誤。至於聲明/定義點,我實際上已經在.mm文件中定義了值和函數體,爲了簡單起見,我只是舉了一個例子。顯然這些變量沒有命名爲a_variable,由於簽署合同,我無法顯示我的任何代碼。 – 2010-06-25 11:28:20

+0

@ Ricardo好的,這有點奇怪。檢查庫('blah.a')是否實際出現在應用目標的「鏈接二進制庫」階段。同時檢查庫實際上是否導出了所需的符號。如果這兩個都是真的,那麼我很難... – walkytalky 2010-06-25 12:11:15

+0

現在你提到它,也許它不是出口我想要的全球符號。但我怎麼能確定呢? – 2010-06-25 14:40:30

0

@walkytalky嗯,我在.a上運行nm,使用grep過濾以查看這些符號是否已導出。

host-006:Release-iphonesimulator <username>$ nm -g libCardLib.a | grep CP_ 
nm: no name list 
    U _CP_BACK 
    U _CP_FILE_EXTENSION_SUFFIX 
    U _CP_FILE_PATH 
    U _CP_SUIT_PREFIX 
    U _CP_VALUE_PREFIX 
00002020 D _CP_BACK 
00002018 D _CP_FILE_EXTENSION_SUFFIX 
0000201c D _CP_FILE_PATH 
00002024 D _CP_FRONT 
00002108 D _CP_SUIT_PREFIX 
0000210c D _CP_VALUE_PREFIX 
nm: no name list 
nm: no name list 
nm: no name list 

因此,似乎每個符號都有一個未定義的副本?

+0

我希望我可以假裝我知道這意味着什麼,但我不知道。看起來.a文件可能包含多個符號表 - 可能適用於不同的體系結構? - 並且鏈接器正在尋找它們未定義的符號。但這是我的知識領域之外的某種方式,所以不要聽我說。希望知道他們在說什麼的人很快就會出現! – walkytalky 2010-06-25 16:23:31

+0

好吧,感謝您的幫助,雖然:)如果我不能在一天左右解決這個問題,我只會訴諸複製標題和實施文件。 – 2010-06-25 16:48:47