链接时重复符号

我试图用这个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 

您没有提供一些关键信息,但您可以立即猜测您在globals.h头文件中设置了一些具有外部链接(即变量或函数)的globals.h 。 由于您的globals.h可能包含在两个*.c文件中,因此最终会出现多个定义错误。

从错误消息判断, MASK_IN是明显的候选者。 什么是MASK_IN以及它定义的方式和位置?

编辑:所以,你走了。 您的MASK_INMASK_IN中定义为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. 你已经在global.h定义了global.h
  2. 您已将global.h包含在多个源文件中。

这将导致符号被多重定义。 你应该extern short _MASK_IN; 在你的标题中,实际上在short _MASK_IN = 0x0001;文件short _MASK_IN = 0x0001;的源文件中定义它short _MASK_IN = 0x0001; 。 或者更好的是,假设它是常量,只需在头文件中定义#define。

#ifndef保护你的评论说你使用没有帮助,因为从一个源文件到下一个源文件,这些警卫被清除。 #define仅在任何时间点编译的源中有效。