2010-11-23 39 views
3

當我查看「生成結果」窗口時,每個編譯.m,預編譯.pch和鏈接都有重複條目。爲什麼Xcode編譯我的所有代碼兩次,導致任何全局變量的鏈接器錯誤?

每當我試圖添加一個全局,甚至作爲一個靜態常量,我得到一個鏈接器錯誤。

在鏈接階段,我可以看到一次運行是針對armv6,另一次是針對armv7(編譯iOS設備時)。

但是,編譯iOS模擬器時沒有重複或鏈接器錯誤。

這是一個問題(超出鏈接器錯誤的明顯問題)?如果是這樣,是否會導致性能問題?我該如何糾正這一點?

回答

0

簡短的回答是,不要使用全局變量。 :D Look up extern use with objective-c,它可以幫助你創建一個全球。如果你正在爲arm6和arm7構建,你將有重複的生成條目,因爲它們是不同的程序集。

可能會發生什麼時,您創建一個static const作爲一個全球性的是,它在每個文件中定義。將它放在一個.m文件中,並在其他文件中添加extern關鍵字。這可能是錯誤的,但是,因爲我不使用全局變量。 (並且你也不應該:D)

+0

全局常量沒有什麼問題,只是全局變量。我更喜歡對這些全局常量使用靜態常量而不是#define,因爲它允許您定義類型。 – Jordan 2010-11-23 21:28:09

2

我很確定雙重信息是由通用應用程序編譯引起的。

0

你不應該把定義放在頭文件中。

聲明是像int add(int a, int b);extern int c;

定義是類似int add(int a, int b) { return a+b; }int c;的東西。

如果您在頭文件中定義全局變量int c;,那麼包含它的每個源文件都將定義一個名爲「c」的符號。鏈接器不喜歡它:有2(或3或4 ...)不同的東西叫做c,但它們都需要指向同一個東西。它應該使用哪一個? (這相當於到限定與相同名稱的兩個(非靜態)具有相同名稱的功能,或兩個類。)

取而代之,在一個文件粘在頭文件extern int c;int c;。 armv6和armv7的「重複」編譯是完全正常的,兩種體系結構分別編譯和鏈接,然後編譯成一個「胖」可執行文件。鬆散地說,armv6運行在「舊」設備(3GS之前) armv7運行在「新」設備(3GS +)上,「新」設備也可以運行armv6,但armv7運行速度更快。)

相關問題