當我查看「生成結果」窗口時,每個編譯.m,預編譯.pch和鏈接都有重複條目。爲什麼Xcode編譯我的所有代碼兩次,導致任何全局變量的鏈接器錯誤?
每當我試圖添加一個全局,甚至作爲一個靜態常量,我得到一個鏈接器錯誤。
在鏈接階段,我可以看到一次運行是針對armv6,另一次是針對armv7(編譯iOS設備時)。
但是,編譯iOS模擬器時沒有重複或鏈接器錯誤。
這是一個問題(超出鏈接器錯誤的明顯問題)?如果是這樣,是否會導致性能問題?我該如何糾正這一點?
當我查看「生成結果」窗口時,每個編譯.m,預編譯.pch和鏈接都有重複條目。爲什麼Xcode編譯我的所有代碼兩次,導致任何全局變量的鏈接器錯誤?
每當我試圖添加一個全局,甚至作爲一個靜態常量,我得到一個鏈接器錯誤。
在鏈接階段,我可以看到一次運行是針對armv6,另一次是針對armv7(編譯iOS設備時)。
但是,編譯iOS模擬器時沒有重複或鏈接器錯誤。
這是一個問題(超出鏈接器錯誤的明顯問題)?如果是這樣,是否會導致性能問題?我該如何糾正這一點?
簡短的回答是,不要使用全局變量。 :D Look up extern
use with objective-c,它可以幫助你創建一個全球。如果你正在爲arm6和arm7構建,你將有重複的生成條目,因爲它們是不同的程序集。
可能會發生什麼時,您創建一個static const
作爲一個全球性的是,它在每個文件中定義。將它放在一個.m文件中,並在其他文件中添加extern
關鍵字。這可能是錯誤的,但是,因爲我不使用全局變量。 (並且你也不應該:D)
我很確定雙重信息是由通用應用程序編譯引起的。
你不應該把定義放在頭文件中。
聲明是像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運行速度更快。)
全局常量沒有什麼問題,只是全局變量。我更喜歡對這些全局常量使用靜態常量而不是#define,因爲它允許您定義類型。 – Jordan 2010-11-23 21:28:09