c - 链接时出现重复符号

标签 c makefile

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

相关文章:

c++ - 是否不再包含在 MinGW 和/或 MSYS 中?

java - 如何编译并运行子目录中的java文件

makefile - 在 Makefile 中使用多个 %

makefile - 如何定时执行 gnu make 规则?

c - 使用 win32 和 C 从 WDK 驱动程序中的 UNICODE_STRING 中提取路径名组件

c - 指向结构 "undeclared (first use in this function)"的指针

c - 向指针添加变量不同于向常量添加

c - 通过管道读取字符串时使用 fgets 有困难

c - 当 actual 和 extern 类型不同时会发生什么?

linux/videodev.h : No such file or directory Ubuntu 14. 04