Xcode LD:8 个重复符号,用于架构x86_64

xcode ld: 8 duplicate symbols for architecture x86_64

本文关键字:用于 x86 符号 LD Xcode      更新时间:2023-10-16

我正在用 GLUT 和 OpenGL 制作一个 xcode 和 c++ 游戏。我想在我的游戏中放置一个 3D 模型,这是头文件的一般外观:

unsigned int GunNumVerts = 37812;
float GunVerts [] = {
// f 1/1/1 1582/2/1 4733/3/1
 0.266494348503772, 0.0252334302709736, -0.000725898139236535,
0.265592372987502, 0.0157389511523397, -0.000725898139236535,
0.264890836474847, 0.0182004476109518, -0.00775888079925833,}
float GunNormals [] = {
// f 1/1/1 1582/2/1 4733/3/1
0.986904930120225, -0.0937549933614904, -0.131257990706016,
0.986904930120225, -0.0937549933614904, -0.131257990706016,
0.986904930120225, -0.0937549933614904, -0.131257990706016,}
float GunTexCoords [] = {
// f 1/1/1 1582/2/1 4733/3/1
0.110088, 0.229552,
0.108891, 0.243519,
0.119508, 0.240861,}

我收到此错误:

duplicate symbol _GunNumVerts in: /blah/blah/blah/Mouse.o
/blah/blah/blah/ViewPort.o
ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我正在尝试在我的视口中的显示方法中显示它,如下所示:

glVertexPointer(3, GL_FLOAT, 0, GunVerts);
glNormalPointer(GL_FLOAT, 0, GunNormals);
glTexCoordPointer(2, GL_FLOAT, 0, GunTexCoords);
glDrawArrays(GL_TRIANGLES, 0, GunNumVerts);

我还有其他 7 个重复的符号小短语,但只有一个实际错误。

您在标头中定义了变量。这样,每个变量都存在于每 (8) 个编译单元中。而是标头中声明变量并在.cpp文件中定义它们。

例如:

// Gun.h:
extern unsigned int GunNumVerts;
extern float GunVerts[9];

// Gun.cpp:
unsigned int GunNumVerts;
float GunVerts[9] = {
    // f 1/1/1 1582/2/1 4733/3/1
    0.266494348503772, 0.0252334302709736, -0.000725898139236535,
    0.265592372987502, 0.0157389511523397, -0.000725898139236535,
    0.264890836474847, 0.0182004476109518, -0.00775888079925833};

extern告诉编译器变量的地址稍后解析(由链接器解析)。此外,如果您从不打算在运行时更改这些值,则应将它们声明为 const

/编辑:由于您使用的是具有非常好的 C++11 支持的 clang,因此您也可以对这些值使用 constexpr。然后它们仅驻留在标头中。但是,了解链接器对于C++开发人员非常重要,因此保留原始建议。