链接时重复符号

时间:2013-12-06 18:42:14

标签: c makefile

我正在尝试使用这个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

2 个答案:

答案 0 :(得分:1)

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

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

编辑:所以,你走了。您的MASK_INglobals.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)

你仍然没有提供人们所要求的信息,但是我会说出来并说:

  1. 您已在_MASK_IN
  2. 中定义了global.h
  3. 您已将global.h包含在多个源文件中。
  4. 这将导致符号被多重定义。您应该在标头中extern short _MASK_IN;,并在short _MASK_IN = 0x0001;的源文件中实际定义它。或者更好的是,假设它是常量,只需在头文件中定义#define。

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