Linux中的C ++多重定义

时间:2013-10-01 19:33:47

标签: makefile

当我制作这些文件时,g ++会出现两个错误,即多个定义和先前的定义。

生成文件:

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 $@ $(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;
}

键入make all后的错误消息:

/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

我已经制作了一个shell脚本来测试我的c ++语法和g ++标志以及链接使用的openGL标志。这是成功的。因此,我认为是Makefile导致错误。但我找不到这个问题。

1 个答案:

答案 0 :(得分:4)

你在glTestDemo.o中链接了两次

glTestDemo: glTestDemo.o display.o
    $(CC) $(CFLAGS) glTestDemo.o display.o -o $@ $(LIBDIR) $< $(LIBS
                                                           ^^ 

$&LT;表示目标的第一个依赖项的名称(您列为glTestDemo.o),但您还明确提到了glTestDemo.o。删除$&lt;它应该链接。

更好的是,使用$ ^,这意味着“所有依赖项”(在你的情况下为glTestDemo.o display.o),你可以这样做:

glTestDemo: glTestDemo.o display.o
    $(CC) $(CFLAGS) $^ -o $@ $(LIBDIR) $(LIBS)

详细了解Makefile here

中的特殊变量
相关问题