多个定义...链接器错误

时间:2013-07-20 17:17:18

标签: c linker linker-errors

我定义了一个特殊文件:config.h

我的项目也有文件:

t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp

和#includes:

在t.c:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"
b.c中的

    #include "b.h"
    #include "pp.h"

在pp.c:

    #include "pp.h"
    #include "config.h"
l.cpp中的

    #include "pp.h"
    #include "t.h"
    #include "config.h"

我的*.h文件中没有包含指令,仅在*.c个文件中。我在config.h中定义了这个:

const char *names[i] =
        {
            "brian", "stefan", "steve"
        };

并且在l.cpp,t.c,pp.c中需要该数组但是我收到此错误:

pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1

我在项目中使用的每个*.h文件中都包含了警卫。有任何帮助解决这个问题吗?

2 个答案:

答案 0 :(得分:89)

不要在标头中定义变量。将声明放在其中一个.c文件的头文件和定义中。

在config.h中

extern const char *names[];

在某些.c文件中:

const char *names[] =
    {
        "brian", "stefan", "steve"
    };

如果在头文件中放置全局变量的定义,那么此定义将转到包含此标头的每个.c文件,并且您将获得多个定义错误,因为可以多次声明varible但是可以只定义一次。

答案 1 :(得分:23)

公共函数的声明在头文件中,是的,但定义在标题中也绝对有效!如果要在实用程序函数的标题中定义事物,而不想在每个c文件中再次定义,则可以将定义声明为静态(整个程序只允许1个副本)。 I.E.定义枚举和静态函数以将枚举转换为字符串。然后,您不必为包含标头的每个.c文件重写enum到字符串转换器。 :)