C++ 奇怪的重新定义的符号

C++ 奇怪的重新定义的符号,c++,include,compiler-errors,C++,Include,Compiler Errors,我将此标题包含在我自己的标题中: 编译时,我开始出现如下错误: CMakeFiles/bin.dir/SoundProjection.cc.o: In function `Gnuplot::reset_plot()': /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/new:105: multiple definition of `Gnuplot::reset_plot()' CMakeFiles/bin.dir/main.cc.o:p

我将此标题包含在我自己的标题中:
编译时,我开始出现如下错误:

CMakeFiles/bin.dir/SoundProjection.cc.o: In function `Gnuplot::reset_plot()': /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/new:105: multiple definition of `Gnuplot::reset_plot()' CMakeFiles/bin.dir/main.cc.o:project/gnuplot-cpp/gnuplot_i.hpp:962: first defined here CMakeFiles/bin.dir/SoundProjection.cc.o: In function `Gnuplot::set_smooth(std::basic_string, std::allocator > const&)': project/gnuplot-cpp/gnuplot_i.hpp:1041: multiple definition of `Gnuplot::set_smooth(std::basic_string, std::allocator > const&)' CMakeFiles/bin.dir/main.cc.o:project/gnuplot-cpp/gnuplot_i.hpp:1041: first defined here CMakeFiles/bin.dir/SoundProjection.cc.o:/usr/include/eigen2/Eigen/src/Core/arch/SSE/PacketMath.h:41: multiple definition of `Gnuplot::m_sGNUPlotFileName' cmakfiles/bin.dir/SoundProjection.cc.o:在函数“Gnuplot::reset_plot()”中: /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/new:105:Gnuplot::reset_plot()的多重定义 CMakeFiles/bin.dir/main.cc.o:project/gnuplot cpp/gnuplot_i.hpp:962:首先在这里定义 CMakeFiles/bin.dir/SoundProjection.cc.o:在函数“Gnuplot::set_smooth(std::basic_string,std::allocator>const&)”中: project/gnuplot cpp/gnuplot_i.hpp:1041:gnuplot::set_smooth(std::basic_string,std::allocator>const&)的多重定义 CMakeFiles/bin.dir/main.cc.o:project/gnuplot cpp/gnuplot_i.hpp:1041:首先在这里定义 CMakeFiles/bin.dir/SoundProjection.cc.o:/usr/include/eigen2/Eigen/src/Core/arch/SSE/PacketMath.h:41:Gnuplot::m_sGNUPlotFileName的多重定义 我知道在这混乱中很难看到,但看看重新定义是在哪里发生的。它们发生在/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/new:105等文件中。新操作员如何获取有关gnuplot头的信息?我甚至不能编辑那个文件。这怎么可能呢?我甚至不知道如何开始调试这个。我希望我已经提供了足够的信息。我无法在一个小项目中重现这一点。我主要是在寻找如何找出为什么会发生这种情况以及如何追踪它的技巧


谢谢

看起来您包含了冲突的标题。尝试检查您的包含路径。它们通常在
-I
指令(至少在gcc中)或环境变量中定义。

看起来您包含了冲突的标题。尝试检查您的包含路径。它们通常在
-I
指令(至少在gcc中)或环境变量中定义。

您显然违反了“一个定义规则”。头文件中有很多定义。其中有些是类或类模板(这很好),有些是内联函数或函数模板(这也很好),有些是“普通”函数和非模板的静态成员(这不好)


“一个定义”规则规定,您的程序最多应包含一个实体的定义。例外情况是类、内联函数、函数模板、类模板的静态成员(我可能忘了什么)。对于这些实体,只要同一实体的两个定义不在同一翻译单元中,就可能存在多个定义。因此,将此头文件包含到多个翻译单元中会导致多个定义。

您显然违反了“一个定义规则”。头文件中有很多定义。其中有些是类或类模板(这很好),有些是内联函数或函数模板(这也很好),有些是“普通”函数和非模板的静态成员(这不好)


“一个定义”规则规定,您的程序最多应包含一个实体的定义。例外情况是类、内联函数、函数模板、类模板的静态成员(我可能忘了什么)。对于这些实体,只要同一实体的两个定义不在同一翻译单元中,就可能存在多个定义。因此,将此头文件包含到多个翻译单元中会导致多个定义。

读取编译器错误通常会有所帮助。您应该学会理解编译器告诉您的内容。它抱怨符号被重新定义的事实表明,您正在违反“一个定义”规则。然后它甚至会告诉你这些符号是什么:

class GnuPlot {
//...
   GnuPlot& reset_plot(); // <-- declaration
//...
};
//...
Gnuplot& Gnuplot::reset_plot() { // <-- Definition
    nplots = 0;
    return *this;
}
类GnuPlot{
//...

GnuPlot&reset_plot();//读取编译器错误通常会有所帮助。您应该学会理解编译器告诉您的内容。它抱怨符号被重新定义的事实表明您违反了一个定义规则。然后它甚至会告诉您符号是什么:

class GnuPlot {
//...
   GnuPlot& reset_plot(); // <-- declaration
//...
};
//...
Gnuplot& Gnuplot::reset_plot() { // <-- Definition
    nplots = 0;
    return *this;
}
类GnuPlot{
//...
GnuPlot&reset_plot()//