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"

这是我的生成文件:

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

我的结构有问题吗?任何帮助,将不胜感激。

谢谢

4

2 回答 2

3

是的,你的结构有问题。

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

正确的模式是放置extern int var;在您的标题中,从而为包含您的标题的每个翻译单元提供声明;并且恰好在您的一个int var = 20;源代码文件中,从而提供了一个定义。

于 2013-05-03T20:02:25.600 回答
2

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

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

于 2013-05-03T20:02:08.697 回答