多个定义,即使我正在使用 extern 并包含守卫
multiple definitions even though I'm using extern and include guards
这是我的头文件。
#ifndef P6_H
#define P6_H
#include <stdio.h>
void FoundationC();
void StructureC();
void PlumbingC();
void ElectricC();
void HVACC();
void SheatingC();
extern int DAYS;
#endif
我正在使用生成文件进行所有编译。它能够编译单个 .o 文件文件,但是当它尝试将这些文件转换为单个可执行文件时,它说变量 DAYS 有多个定义,即使它是外部的并且在每个单独的声明和初始化中也是如此。我之前让这个工作,但无法弄清楚为什么它现在不起作用。
哦,这是我的 makefile 代码
all:
gcc -c P6.c
gcc -c foundations.c
gcc -c structure.c
gcc -c plumbing.c
gcc -c electric.c
gcc -c hvac.c
gcc -c sheating.c
gcc P6.h P6.o foundations.o structure.o plumbing.o electric.o hvac.o sheating.o -o P6
我意识到 P6.h 可能不必包含在命令中,但包含守卫应该让它无关紧要不是吗?
另外,如果这个问题是一个骗局,我很抱歉,但我之前确实在寻找答案,这个问题在个人层面上让我发疯,尽管这是针对学校的。
这是我得到的错误。
gcc -c P6.c
gcc -c foundations.c
gcc -c structure.c
gcc -c plumbing.c
gcc -c electric.c
gcc -c hvac.c
gcc -c sheating.c
gcc P6.h P6.o foundations.o structure.o plumbing.o electric.o hvac.o sheating.o -o P6
structure.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
plumbing.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
electric.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
hvac.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
sheating.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [all] Error 1
initialized in each individually.
你错了。如果您在不同的翻译单元中初始化相同的变量,您认为应该发生什么?如果它们使用不同的值,您认为会发生什么情况?
你只能在你的程序中定义一个变量,多次声明也没问题。从除了一个翻译单元之外的所有翻译单元中,删除 DAYS
的定义以解决此问题。
首先,去掉makefile中最后一条命令的P6.h。gcc中的-o选项用于编译和链接多个源代码files.So,这没有任何意义。
其次在.c文件中将DAYS定义为"int DAYS",你可以在相应的.h文件中将其声明为extern,并将此.h文件包含在所有其他源文件中。c files.This将解决这个多重定义的问题。
Example:Define 天 A.c 中的 "int DAYS" 并且您在 A.h.Now 中将其声明为 "extern int DAYS",您可以将此 A.h 包含在其他源文件中,例如B.c , C.c ,D.c 等等。
为了帮助大家理解,下面是对@FUZxxl的回答的扩展,是正确的。如果您的编译单元中有以下内容(编译单元是 .c 源文件加上所有包含的 .h 文件):
extern int DAYS;
...
int DAYS = 1;
然后 DAYS
的第二个声明覆盖第一个声明它是 extern
的声明。因此,该变量现在不再是 extern
,如果您在多个源文件中执行此操作,您现在将因此拥有多个定义并且链接器会抱怨。
如果您必须初始化 DAYS
,那么您可以在一个地方完成,最好是在主文件中。
这是我的头文件。
#ifndef P6_H
#define P6_H
#include <stdio.h>
void FoundationC();
void StructureC();
void PlumbingC();
void ElectricC();
void HVACC();
void SheatingC();
extern int DAYS;
#endif
我正在使用生成文件进行所有编译。它能够编译单个 .o 文件文件,但是当它尝试将这些文件转换为单个可执行文件时,它说变量 DAYS 有多个定义,即使它是外部的并且在每个单独的声明和初始化中也是如此。我之前让这个工作,但无法弄清楚为什么它现在不起作用。 哦,这是我的 makefile 代码
all:
gcc -c P6.c
gcc -c foundations.c
gcc -c structure.c
gcc -c plumbing.c
gcc -c electric.c
gcc -c hvac.c
gcc -c sheating.c
gcc P6.h P6.o foundations.o structure.o plumbing.o electric.o hvac.o sheating.o -o P6
我意识到 P6.h 可能不必包含在命令中,但包含守卫应该让它无关紧要不是吗?
另外,如果这个问题是一个骗局,我很抱歉,但我之前确实在寻找答案,这个问题在个人层面上让我发疯,尽管这是针对学校的。
这是我得到的错误。
gcc -c P6.c
gcc -c foundations.c
gcc -c structure.c
gcc -c plumbing.c
gcc -c electric.c
gcc -c hvac.c
gcc -c sheating.c
gcc P6.h P6.o foundations.o structure.o plumbing.o electric.o hvac.o sheating.o -o P6
structure.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
plumbing.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
electric.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
hvac.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
sheating.o:(.data+0x0): multiple definition of `DAYS'
foundations.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [all] Error 1
initialized in each individually.
你错了。如果您在不同的翻译单元中初始化相同的变量,您认为应该发生什么?如果它们使用不同的值,您认为会发生什么情况?
你只能在你的程序中定义一个变量,多次声明也没问题。从除了一个翻译单元之外的所有翻译单元中,删除 DAYS
的定义以解决此问题。
首先,去掉makefile中最后一条命令的P6.h。gcc中的-o选项用于编译和链接多个源代码files.So,这没有任何意义。
其次在.c文件中将DAYS定义为"int DAYS",你可以在相应的.h文件中将其声明为extern,并将此.h文件包含在所有其他源文件中。c files.This将解决这个多重定义的问题。 Example:Define 天 A.c 中的 "int DAYS" 并且您在 A.h.Now 中将其声明为 "extern int DAYS",您可以将此 A.h 包含在其他源文件中,例如B.c , C.c ,D.c 等等。
为了帮助大家理解,下面是对@FUZxxl的回答的扩展,是正确的。如果您的编译单元中有以下内容(编译单元是 .c 源文件加上所有包含的 .h 文件):
extern int DAYS;
...
int DAYS = 1;
然后 DAYS
的第二个声明覆盖第一个声明它是 extern
的声明。因此,该变量现在不再是 extern
,如果您在多个源文件中执行此操作,您现在将因此拥有多个定义并且链接器会抱怨。
如果您必须初始化 DAYS
,那么您可以在一个地方完成,最好是在主文件中。