2010-10-08 44 views
1

我試圖建立在Xcode 3.2.4應用程序和正在以下鏈接錯誤:Xcode的連接器和模塊:未定義的符號「___block_global_1」

Undefined symbols: 
    "___block_global_1", referenced from: 
     ___block_holder_tmp_1.120 in foobarbaz.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

我茫然地解釋一下我我的源文件中可能會導致錯誤。我有,我定義爲全局變量,像這樣一個塊:

typedef void(^error_block_t)(NSError* error); 

error_block_t error_handler_s = ^void(NSError* error) 
{ 
    //... 
} 

此塊在源空的空間中定義的(我在編譯的Objective-C++)編譯沒有錯誤。

更新:將塊移動爲引用它的例程的局部變量是可行的(雖然不是首選)解決方法。

什麼給?

回答

0

在這一點上,我相信這個問題是一個錯誤。

0

如果error_handler_s不打算導出,則可以將它作爲另一個解決方法使其成爲static

namespace { 
    ... 
    static error_block_t error_handler_s = ^void(NSError* error) { ... }; 
    ... 
} 

否則,我相信這是一個gcc中的錯誤。

+0

感謝您的回覆;如果我閱讀規範右側的7.3.1.1(2),似乎我使用的匿名名稱空間範式優於聲明變量「static」 - 因爲前者旨在替換後者,所以我看不到這將如何幫助。如果我錯了,請告訴我。 – fbrereto 2010-10-08 20:46:47

+0

@fbrereto:理論上,是的。但是,在gcc中,匿名命名空間中的非'靜態'全局變量仍然會爲鏈接器生成一個符號,而'static'全局變量則不會。標準並不總是正確地描述現實世界。 – kennytm 2010-10-09 06:41:48

+0

你對標準訴現實世界當然是正確的!我會給你的建議一個鏡頭;謝謝。 – fbrereto 2010-10-09 16:30:59