在.obj文件中已经定义了该函数

10
据我所知,当您有多个文件包括相同的文件时,此错误是由未正确使用头文件保护引起的。在我的情况下,这是导致错误的包含树:
文件A包含Z,其中包含我需要的函数。文件B包括A,文件C也包括A。
如果没有任何#pragma once,程序会给出许多相同错误的变体:
blahblah.obj: error LNK2005: class some::namespace::ObjectType Object already 
    defined in dialogDlg.obj

我只是想知道,根据我描述的包含树,正确的编译方式是什么?
我尝试在文件Z上使用#pragma once,但没有起作用。我还尝试在文件A上使用#pragma once,也没有起作用。最后,我尝试在A和Z上都使用,也没有起作用。

你的做法让我觉得你没有使用单独的头文件? - Bertil Baron
1个回答

14

看起来你正在尝试在头文件中定义一个变量。如果该头文件包含在多个源文件中,它将在每个源文件中被定义,从而导致错误。

相反,将其声明为extern,然后在其中一个源文件中进行定义。

因此,在头文件中:

extern ObjectType Object;

在源文件中:

ObjectType Object;

2
我只想补充一点,这与包含保护无关。包含保护有助于防止在一个源文件中多次包含相同的头文件。我们正在研究一个头文件被包含在不同的源文件中而导致问题的情况。 - Angew is no longer proud of SO
好的,如果我需要在B文件和C文件(两个.cpp文件)中都访问这些变量和对象,有没有一种干净的方法来实现这个? - xcdemon05
1
只要你将b.cpp和c.cpp一起编译,这个解决方案已经实现了你想要的。 - us2012

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接