所以这就是我的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 :(得分:3)
是的,你正在构建错误的东西。
对于任何特定变量,您可能有多个声明,但只有一个定义。通过将变量的定义放在标题中,您违反了此规则。假设您的标题包含在每个标题中,您现在在main
和util
翻译单元中都有定义。
正确的模式是在标题中放置extern int var;
,从而为包含标题的每个翻译单元提供声明;和{{1>}在完全一个的源代码文件中,从而提供一个定义。
答案 1 :(得分:2)
是的,您应该将全局变量保存在实现文件(.c)中。如果你在头文件中有它们,那么它们会包含在多个实现文件中,并且会出现多重定义错误。
更好的是,你的程序中不应该有任何全局变量。