2013-03-06 66 views
3

我正在創建一個openGL引擎(ES 1.1的一面和ES 2.0的一面)。這兩個引擎目前都有一些恆定的頂點(如下所示)。不幸的是,在編譯時我收到以下錯誤:const聲明導致Xcode中的鏈接器錯誤

ld: 1 duplicate symbol for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) with the duplicate symbol being _Verticies. 

爲什麼Xcode的抱怨在兩個單獨的文件複製恆定值?這些文件符合相同的協議......但大部分是他們的連接。在C++中,此方法正常工作,但在轉換爲Objective-C時會導致出現錯誤。

//Define the positions and colors of two triangles 
const Vertex Verticies[] = { //per vertex data 
    {{-0.5f, -0.866f},{1.0f, 1.0f, 0.5f, 1.0f}}, 
    {{0.5f, -0.866f},{1.0f, 1.0f, 0.5f, 1.0f}}, 
    {{0.0f, 1.0f},{1.0f, 1.0f, 0.5f, 1.0f}}, 
    {{-0.5f, -0.866f},{0.5f, 0.5f, 0.5f, 0.0f}}, 
    {{0.5f, -0.866f},{0.5f, 0.5f, 0.5f}}, 
    {{0.0f, -0.4f},{0.5f, 0.5f, 0.5f}}, 
}; 

解決方案:截至目前,默認情況下,Objective-C中的const值受制於項目的範圍,而不僅僅是文件的範圍。在C++中,當創建一個const值時,範圍會自動限制在它所在的文件中。要在Objective-C中解決此問題,必須使用靜態標記將範圍限制爲該特定文件。你也可以使用一個外部標籤(但是這將有點更多的工作)。

+1

在你的問題中,你應該真的提到它在C++中工作並停止在Objective-C中工作。 – zneak 2013-03-06 20:12:59

+0

我做過了,這是在我的聲明最後用C++表示這種方法工作正常。我會澄清一下,以防萬一出現混淆。 – TheCodingArt 2013-03-09 17:58:19

回答

4

它在C++中起作用,因爲在C++中,const的全局變量也暗示爲static。在C中不是這種情況。當您更改爲從C繼承的Objective-C時,此行爲將丟失並且const符號突然變爲extern

static前綴const變量以獲得與C++中相同的行爲。

+0

由於關鍵字具有不同的含義,因此在討論變量時使用術語'static'會引起混淆。在這種情況下,「const」暗示「內部聯繫」會更清晰。 – 2013-03-06 20:18:31

+0

感謝您的解釋。我真的不知道,但現在我知道了。有趣的事實! – TheCodingArt 2013-03-06 21:31:22

3

如果僅在一個編譯單元(文件)中使用Verticies變量,則應該使用存儲類說明符static來聲明它。

這可以防止編譯器發出鏈接器可見的外部符號。用C語言:符號然後有內部聯繫。

C和C++之間的許多細微差別之一是C中的const並不意味着內部鏈接。

+0

文件級變量的'const'意味着'static'。除非數組之前被定義爲'extern const',否則不太可能成爲問題。 – zneak 2013-03-06 20:03:22

+0

這是真的,但我更大的問題是爲什麼在C++中聲明此常量在兩個不同的文件中工作,但不在Objective-C中? – TheCodingArt 2013-03-06 20:04:53

+0

@zneak這隻適用於C++,但它不適用於C。 – 2013-03-06 20:09:31