3

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

4

2 回答 2

5

它在 C++ 中有效,因为在 C++ 中,全局变量 withconst也暗示为static. 在 C 中情况并非如此。当您更改为从 C“继承”的 Objective-C 时,这种行为会丢失并且const符号突然变为extern.

const为变量添加前缀static以获得与 C++ 中相同的行为。

于 2013-03-06T20:11:31.730 回答
3

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

这可以防止编译器发出链接器可见的外部符号。在 C 语言中:符号具有内部链接。

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

于 2013-03-06T20:00:47.030 回答