我正在创建一个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标签(但这会更多一点)。
答案 0 :(得分:5)
它适用于C ++,因为在C ++中,const
的全局变量也隐含为static
。在C中不是这种情况。当您更改为从C“继承”的Objective-C时,此行为将丢失,const
符号突然变为extern
。
使用const
为static
变量添加前缀,以获得与C ++相同的行为。
答案 1 :(得分:3)
如果Verticies
变量仅在一个编译单元(文件)中使用,则应使用存储类说明符static
声明它。
这可以防止编译器发出链接器可见的外部符号。在C lingo:符号然后有内部联系。
C和C ++之间的许多细微差别之一是C中的const
并不意味着内部联系。