Ошибка компоновки при включении файла, содержащего массив - PullRequest
1 голос
/ 08 декабря 2011

В моем объекте класса есть следующий код:

void Object::drawSurface()
{
   GLUnurbsObj *nurbSurface;

   nurbSurface = gluNewNurbsRenderer();
   gluNurbsProperty( nurbSurface, GLU_SAMPLING_TOLERANCE, 25.0 );
   gluNurbsProperty( nurbSurface, GLU_DISPLAY_MODE, GLU_FILL );
   GLfloat knots[26] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

   gluBeginSurface( nurbSurface );
   gluNurbsSurface( nurbSurface, 26, knots, 26, knots,
        13*3, 3, &points[0][0][0], 13, 13, GL_MAP2_VERTEX_3 );
   gluEndSurface( nurbSurface );
 }

Также включен файл .txt, который содержит массив со всеми точками.Я включаю свой объект класса в любой другой класс.Затем я получаю эту ошибку:

ld: duplicate symbol _points in openglscene.o and main.o
collect2: ld returned 1 exit status

Компилятор означает символ точки [], который объявлен в txt.Я понятия не имею, почему эта ошибка появляется

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Этот .txt файл прямо или косвенно включен как минимум в два ваших исходных файла.То есть, с точки зрения компоновщика, он определяется дважды.

В заголовочных файлах вы должны сказать только:

extern definition of points;

Так, например, если этоint point[100] например, вы говорите:

extern int point[100];

Затем в один и только один из исходных файлов включается файл .txt.

Примечание: То же самое верно для любой переменной или функции.Чтобы проверить это, вы можете попробовать определить простую функцию в одном из заголовков и включить ее в две позиции.Вы получите ту же ошибку компоновщика для этого тоже.

0 голосов
/ 09 декабря 2011

Вы также можете рассмотреть возможность присвоения имени файлу ".h" вместо ".txt"!(Это не решение - просто предложение) - Шахбаз уже объяснил решение.

...