我正在创建一个 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 提示两个单独的文件中存在重复的常量值?文件符合相同的协议(protocol)……但在大多数情况下,这是它们的连接。在 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 中的常量值似乎默认受项目范围的影响,而不仅仅是文件的范围。在 C++ 中,当创建一个 const 值时,范围会自动限制在它所在的文件中。要在 Objective-C 中解决这个问题,必须使用 static 标记将范围限制在该特定文件中。您也可以使用 extern 标签(但这会多一些工作)。
最佳答案
它适用于 C++,因为在 C++ 中,具有 const
的全局变量也隐含为 static
。在 C 中不是这种情况。当您更改为“继承”自 C 的 Objective-C 时,此行为将丢失并且 const
符号突然变为 extern
。
在 const
变量前加上 static
以获得与 C++ 中相同的行为。
关于objective-c - 在 Xcode 中导致链接器错误的 Const 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15256777/