Const声明导致Xcode中的链接器错误

时间:2013-03-06 19:56:58

标签: objective-c xcode header const linker-errors

我正在创建一个openGL引擎(ES 1.1的一侧和ES 2.0的一侧)。两个引擎目前都有一些恒定的顶点(如下所示)。不幸的是,在编译时我收到以下错误:

 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中修复此问题,必须使用静态标记将范围限制为该特定文件。您也可以使用extern标签(但这会更多一点)。

2 个答案:

答案 0 :(得分:5)

它适用于C ++,因为在C ++中,const的全局变量也隐含为static。在C中不是这种情况。当您更改为从C“继承”的Objective-C时,此行为将丢失,const符号突然变为extern

使用conststatic变量添加前缀,以获得与C ++相同的行为。

答案 1 :(得分:3)

如果Verticies变量仅在一个编译单元(文件)中使用,则应使用存储类说明符static声明它。

这可以防止编译器发出链接器可见的外部符号。在C lingo:符号然后有内部联系。

C和C ++之间的许多细微差别之一是C中的const并不意味着内部联系。