我试图用这个 makefile 编译我的程序,但链接器让我有些大惊小怪,说有重复的符号。我尝试使用这个 makefile 但运气不佳。我的程序只有三个文件,pdp429.c、instructions.c 和 global.h。感谢任何帮助,谢谢!
以下是错误(有 46 个“重复符号”错误) “重复符号 _MASK_IN 位于: pdp429.o 指令.o ld:架构 x86_64 的 46 个重复符号 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
可能包含在您的两个 *.c
文件中,因此您最终会遇到多个定义错误。
从错误消息来看,MASK_IN
是明显的候选者。 MASK_IN
是什么?它是如何定义的以及在哪里定义的?
编辑:所以,给你。您的 MASK_IN
在 globals.h
中定义为 short MASK_IN = 0x0001;
。这肯定会导致多重定义错误。看来您确实尝试定义一个命名常量。如果是这样,在 C 语言中通常会使用#define 来定义 list 常量,即做
#define MASK_IN 0x0001
但是如果您确实想使用命名对象,那么对于标量类型,最好的方法是这样做
static const short MASK_IN = 0x0001;
在头文件中。
如果您的 MASK_IN
旨在成为全局变量(而不是常量),那么您唯一的选择就是使用
extern short MASK_IN;
在头文件中和
short MASK_IN = 0x0001;
在一个(且仅有一个).c
文件中。
关于c - 链接时出现重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431268/