xcode ld: 8 повторяющихся символов для архитектуры x86_64

Я делаю игру в Xcode и C ++ с GLUT & OpenGL. Я хочу разместить 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 других дублирующих символов, но есть только одна ошибка.

1

Решение

Вы определили свои переменные в заголовке. Таким образом, каждая переменная присутствует в каждой (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,

/ Edit: поскольку вы используете clang, который имеет очень хорошую поддержку C ++ 11, вы также можете использовать constexpr для этих значений. Тогда они только находятся в заголовке. Тем не менее, понимание компоновщика важно для разработчика на C ++, поэтому оригинальный совет остается.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]