我正在创建一个 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 标签(但这需要更多的工作)。