我正在构建一些看起来像这样的程序:
"a.c" #includes "a.h" and #includes "b.h"
"b.c" #includes "b.h"
假设我只在“bh”中声明一个名为“var”的变量
在使用“nmake”在“cmd”上编译它时,我收到以下错误:
b.obj:错误 LNK2005:var 已在 a.obj 中定义
但是我没有在ac或ah上定义它,仅在bh上
什么会导致这种情况?谢谢
我正在构建一些看起来像这样的程序:
"a.c" #includes "a.h" and #includes "b.h"
"b.c" #includes "b.h"
假设我只在“bh”中声明一个名为“var”的变量
在使用“nmake”在“cmd”上编译它时,我收到以下错误:
b.obj:错误 LNK2005:var 已在 a.obj 中定义
但是我没有在ac或ah上定义它,仅在bh上
什么会导致这种情况?谢谢
但是我没有在ac或ah上定义它,仅在bh上
这不是它的工作原理。所有包含的头文件中的所有代码都由预处理器放在一起并传递给编译器,然后编译器将其编译成目标文件。该代码称为“翻译单元”。如果在另一个翻译单元中定义了相同的变量,它也将出现在生成的目标文件中。然后,当您将这些目标文件链接在一起时,两者都将定义相同的变量,因此链接器将抱怨重复符号。
你应该做的是在一个 *.c 文件中定义变量,并且只extern
在 *.h 文件中声明它。这样,其他翻译单元将知道该变量,但不会尝试自己定义它。它只会在包含实际定义它的 *.c 文件的翻译单元中定义。