2013-05-03 90 views
0

所以这是我的defs.h是如何构成的:头文件结构

#ifndef DEF_H 
#define DEF_H 
#include <stdio.h> 

... 

int var = 20; 
int test = 1; 

... 

#endif 

现在,我的main.c和util.c,全部用:

#include "defs.h" 

这是我的makefile :

all: clean compile 

compile: clean main 
    @echo SUCCESS: COMPILED FILES 

main: main.o util.o 
    cc main.o util.o -o progname 

main.o: main.c 
    cc -o main.o -c main.c 

util.o: util.c 
    cc -o util.o -c util.c 

clean: 
    -rm -rf *.a *.o *.so progname 
    @echo SUCCESS: CLEANED FILES 

然而,当我运行make,无论是目标文件编译罚款,但在做最后的链接时,我不断收到:

util.o:(.data+0x0): multiple definition of `var' 
main.o:(.data+0x0): first defined here 

我是第结构出问题了吗?任何帮助,将不胜感激。

感谢

+0

参见[什么在C'extern'变量(http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c/)。 – 2013-05-03 20:21:12

回答

2

是的,你应该让你的全局变量,在您的实现文件(.c)中。如果您将它们放在标题中,那么它们会包含在多个实现文件中,并且会出现多重定义错误。

更好的是,你的程序中不应该有任何全局变量。

3

是的,你正在构造错误的东西。

对于任何特定变量,您可能有几个声明,但只有一个定义。通过将变量的定义放在标题中,您违反了此规则。假设您的标题包含在每个标题中,则现在您在mainutil翻译单元中都有定义。

正确的图案是将extern int var;在头,从而提供了声明每翻译单元,其包括的报头;和int var = 20;恰好一个你的源代码文件,从而提供了一个定义。

+0

我做了这个,现在我得到了“util.c :(。text + 0x346):未定义的引用var'” – Pat 2013-05-03 20:16:27

+0

现在你缺少'int var = 20;'。它应该在文件范围内放入一个'.c'文件中。 – 2013-05-03 20:36:20