我正在尝试使用这个makefile编译我的程序,但链接器给了我一些大惊小怪,说有重复的符号。我试过玩这个makefile,但我运气不好。我的程序只有三个文件,pdp429.c,instructions.c和global.h。感谢任何帮助!
以下是错误,(有46个“重复符号”错误) “重复符号_MASK_IN in: pdp429.o instructions.o ld:46个体系结构x86_64的重复符号 collect2:ld返回1退出状态 make:*** [pdp429]错误1“
CFLAGS = -O0 -pg -ggdb3 -Wall
all: pdp429
pdp429: pdp429.o instructions.o
gcc $(CFLAGS) pdp429.o instructions.o -o pdp429
pdp429.o: pdp429.c global.h
gcc $(CFLAGS) pdp429.c -c
instructions.o: instructions.c global.h
gcc $(CFLAGS) instructions.c -c
clean:
rm -f *.o pdp429
答案 0 :(得分:1)
您没有提供一些关键信息,但您可以立即猜测您在globals.h
头文件中设置了一些具有外部链接(即变量或函数)的实体。由于globals.h
可能包含在*.c
文件中,因此最终会出现多个定义错误。
MASK_IN
是明显的候选者,从错误消息判断。什么是MASK_IN
以及定义的方式和位置?
编辑:所以,你走了。您的MASK_IN
在globals.h
中定义为short MASK_IN = 0x0001;
。这肯定会导致多重定义错误。看起来你实际上试图定义一个命名常量。如果是这样,用C语言通常会使用#define
来定义清单常量i,.e。做
#define MASK_IN 0x0001
但是如果你真的想使用一个命名对象,那么对于标量类型,最好的方法就是
static const short MASK_IN = 0x0001;
在头文件中。
如果您的MASK_IN
打算成为全局变量(不是常量),那么您唯一的选择就是使用
extern short MASK_IN;
头文件中的和
short MASK_IN = 0x0001;
在一个(只有一个).c
个文件中。
答案 1 :(得分:0)
你仍然没有提供人们所要求的信息,但是我会说出来并说:
_MASK_IN
global.h
global.h
包含在多个源文件中。这将导致符号被多重定义。您应该在标头中extern short _MASK_IN;
,并在short _MASK_IN = 0x0001;
的源文件中实际定义它。或者更好的是,假设它是常量,只需在头文件中定义#define。
#ifndef
保护你的评论说你使用没有帮助,因为从一个源文件到下一个源文件,这些警卫被清除。 #define仅在任何时间点编译的源中有效。