C++ c++;include.cpp:避免多个定义错误

C++ c++;include.cpp:避免多个定义错误,c++,C++,我有一个项目,其中包括其他项目中包含的几个文件 A.h --> B.h means A.h is included in B.h 有很多像这样的包裹体 A.h --> X.h B.h --> A.h B.h --> X.h 这一切都很好。现在我有一个问题,我需要包括一个cpp文件(不是我的文件,不能用它改变任何东西)。 编辑:此.cpp没有对应的.h文件 一旦我做了类似的事情 Z.cpp --> B.h 我得到了多个声明的编译器错误。 我也试过了 Z.cpp

我有一个项目,其中包括其他项目中包含的几个文件

A.h --> B.h means A.h is included in B.h
有很多像这样的包裹体

A.h --> X.h
B.h --> A.h
B.h --> X.h
这一切都很好。现在我有一个问题,我需要包括一个cpp文件(不是我的文件,不能用它改变任何东西)。 编辑:此.cpp没有对应的.h文件 一旦我做了类似的事情

Z.cpp --> B.h
我得到了多个声明的编译器错误。 我也试过了

Z.cpp --> B.cpp
类似的结果,只是错误更少(B.h包含在许多其他的.h文件中)

我怎样才能包括这个.cpp


编辑:我确实理解错误的来源,我只是想知道是否有一些解决方法

> P>这是C++软件开发的基本内容,我建议您阅读一本关于如何编译和编译程序的介绍。 <>基本上,在C++中,Y.*包含*.CPP源文件中的*.h文件,
然后编译每个*.cpp文件,
然后链接将所有编译文件(通常是*nix上的*.o或Windows上的*.obj)链接到一个可执行程序或一个库中,然后链接到一个程序中

我会考虑一个非常糟糕的做法:把一个**,CPP文件包含到另一个CPP文件中。


当你使用QtC造饰者时,你应该有一个已经完成这个过程的项目。

< P>这是C++软件开发的基本内容,我建议你读一本书,介绍如何编译和构建程序。 <>基本上,在C++中,Y.*包含*.CPP源文件中的*.h文件,
然后编译每个*.cpp文件,
然后链接将所有编译文件(通常是*nix上的*.o或Windows上的*.obj)链接到一个可执行程序或一个库中,然后链接到一个程序中

我会考虑一个非常糟糕的做法:把一个**,CPP文件包含到另一个CPP文件中。


当您使用QTCreator时,您应该有一个已经负责此过程的项目。

如果您使用QTCreator,那么它应该为项目中包含的每个源文件构建目标文件

这就是为什么会出现多个定义错误。比如说,您有一个源文件
Z.cpp
,它内置在
Z.o
中。然后在
B.cpp
中包含
Z.cpp
,它内置在
B.o
中。现在,当链接器尝试将
Z.o
B.o
链接到可执行程序时,
Z.cpp
中定义的符号将存在于两个目标文件中,从而导致错误

IDE(QtCreator)将确保构建并链接两个源文件,形成一个可执行文件。不要将#任何源文件包含到另一个源文件(或者更糟的是,头文件)中


类、结构、函数原型和外部变量声明位于(或应该位于)包含的头文件中。非内联类或结构成员函数和函数的实现在源文件中,编译器和链接器将知道如何从目标文件引用它们。

如果使用QtCreator,则它应为项目中包含的每个源文件构建目标文件

这就是为什么会出现多个定义错误。比如说,您有一个源文件
Z.cpp
,它内置在
Z.o
中。然后在
B.cpp
中包含
Z.cpp
,它内置在
B.o
中。现在,当链接器尝试将
Z.o
B.o
链接到可执行程序时,
Z.cpp
中定义的符号将存在于两个目标文件中,从而导致错误

IDE(QtCreator)将确保构建并链接两个源文件,形成一个可执行文件。不要将#任何源文件包含到另一个源文件(或者更糟的是,头文件)中


类、结构、函数原型和外部变量声明位于(或应该位于)包含的头文件中。非内联类或结构成员函数和函数的实现在源文件中,编译器和链接器将知道如何从目标文件引用它们。

鉴于此处的注释,我添加了自己的头文件。这就解决了问题。感谢您指出这一点。

鉴于这里的评论,我添加了自己的头文件。这就解决了问题。感谢您指出这一点。

不要包含源文件。将它们分别编译成对象文件,然后链接在一起。你是说用这个cpp制作一个库?不,只是将源文件单独编译成单个对象文件。你使用的是什么编译器?什么(如果有的话)IDE?您如何构建您的程序?gcc和qtcreator。如果我不包括它,那么编译器现在如何在cpp中包含该类及其成员?不要包含源文件。将它们分别编译成对象文件,然后链接在一起。你是说用这个cpp制作一个库?不,只是将源文件单独编译成单个对象文件。你使用的是什么编译器?什么(如果有的话)IDE?您如何构建您的程序?gcc和qtcreator。如果我不包括它,编译器现在是如何在cpp中存在该类及其成员的?问题是这个.cpp没有对应的.h文件。而且它是一个外部文件,因此em不可能对此进行任何更改。如果您在源代码列表中包含此cpp,您可以自己为此cpp构建一个头文件,该头文件只是要转发到其他cpp文件的函数声明的副本。头文件只是一个转发声明,它告诉编译器您将在编译后的源代码的其他地方找到这样的方法。。。因此,请使用该方法。问题是此.cpp没有对应的.h文件。而且它是一个外部文件,因此em不可能对此进行任何更改。如果您将此cpp包括在源列表中,您可以自己为此cpp构建头文件