2013-10-01 3 views
1

Когда я делаю эти файлы, g ++ возникает две ошибки, которые являются множественным определением и предыдущим определением.C++ множественное определение в Linux

Makefile:

INCLUDE = -I/usr/X11R6/include/ 
LIBDIR = -L/usr/X11R6/lib 

FLAGS = -Wall 
CC = g++ 
CFLAGS = $(FLAGS) $(INCLUDE) 
LIBS = -lglut -lGL -lGLU 

glTestDemo.o: glTestDemo.cpp headers.h 
     $(CC) $(CFLAGS) -c glTestDemo.cpp 

display.o: display.cpp headers.h 
     $(CC) $(CLFAGS) -c display.cpp 

glTestDemo: glTestDemo.o display.o 
     $(CC) $(CFLAGS) glTestDemo.o display.o -o [email protected] $(LIBDIR) $< $(LIBS)    # The initial white space is a tab 

all: glTestDemo 

clean: 
     rm glTestDemo *.o 

headers.h

#ifndef __HEADERS_H__ 
#define __HEADERS_H__ 

#include <GL/glut.h> 

extern int NumPoints; 

extern void incorrect_display (void); 

#endif 

display.cpp

#include "headers.h" 

void 
incorrect_display (void) 
{ 
    glClear (GL_COLOR_BUFFER_BIT); 

    glPointSize (1.0); 

    glDrawArrays (GL_POINTS, 0, NumPoints); 

    glFlush(); 
} 

glTestDemo.cpp

#include "headers.h" 

int NumPoints = 5000; 

int 
main (int argc, char** argv) 
{ 
    glutInit (&argc, argv); 
    glutInitDisplayMode (GLUT_RGBA); 
    glutInitWindowPosition (50, 50); 
    glutInitWindowSize (600, 600); 
    glutCreateWindow ("Test title"); 
    glutDisplayFunc (incorrect_display); 
    glutMainLoop(); 
    return 0; 
} 

сообщение об ошибке, как, что после того, как я печатаю сделать все:

/usr/bin/ld: error: glTestDemo.o: multiple definition of 'NumPoints' 
/usr/bin/ld: glTestDemo.o: previous definition here 
/usr/bin/ld: error: glTestDemo.o: multiple definition of 'main' 
/usr/bin/ld: glTestDemo.o: previous definition here 
collect2: error: ld returned 1 exit status 
make: *** [glTestDemo] Error 1 

У меня есть сделать скрипт, чтобы проверить мой C++ синтаксис и г ++ флаг и флаг OPENGL, который используется путем соединения. Это успех. Следовательно, я думаю, что Makefile вызывает ошибку. Но я не могу найти проблему для этого.

ответ

4

Вы связываетесь в glTestDemo.o дважды

glTestDemo: glTestDemo.o display.o 
    $(CC) $(CFLAGS) glTestDemo.o display.o -o [email protected] $(LIBDIR) $< $(LIBS 
                  ^^ 

$ < означает имя первого зависимости от цели (который вы перечислили, как glTestDemo.o), но вы также явно упомянуты glTestDemo. o. Удалите $ <, и он должен соединить.

еще лучше, использовать $ ^, что означает «все зависимости» (glTestDemo.o display.o в вашем случае), и вы можете просто сделать:

glTestDemo: glTestDemo.o display.o 
    $(CC) $(CFLAGS) $^ -o [email protected] $(LIBDIR) $(LIBS) 

Подробнее о специальных переменных в Makefiles here

Смежные вопросы