Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法将函数公开。获取:“;LNK2005“;错误。如何调试链接器错误_C++ - Fatal编程技术网

C++ 无法将函数公开。获取:“;LNK2005“;错误。如何调试链接器错误

C++ 无法将函数公开。获取:“;LNK2005“;错误。如何调试链接器错误,c++,C++,在我的项目中,MyFourierClass::forward\u fft只有一个定义。当我将MyFourierClass::forward\u fft声明为public时,我得到了这个错误,否则就没有错误 错误消息: 1>my_fourier.obj : error LNK2005: "public: void __cdecl MyFourierClass::forward_fft(int)" (?forward_fft@MyFourierClass@@QEAAXH@Z

在我的项目中,MyFourierClass::forward\u fft只有一个定义。当我将MyFourierClass::forward\u fft声明为public时,我得到了这个错误,否则就没有错误

错误消息:

1>my_fourier.obj : error LNK2005: "public: void __cdecl MyFourierClass::forward_fft(int)" (?forward_fft@MyFourierClass@@QEAAXH@Z) already defined in main.obj
1>CGPProject\x64\Debug\CGPProject.exe : fatal error LNK1169: one or more multiply defined symbols found
my_fourier.cpp:

#ifndef MY_FOURIER
#define MY_FOURIER

class MyFourierClass {
double** dataset = 0; 
//public: // <-- un-commenting this line causes the linker error.
    void forward_fft(int);
};
void MyFourierClass::forward_fft(int bins) {
    bins = bins + 1;

};
#endif
是否有调试链接器错误的标准方法?我认为另一个文件中可能有定义,所以我删除了项目中的所有其他文件。现在只有main.cpp和my_fourier.cpp。我正在使用VisualStudio2019


提前感谢。

因为您使用include指令将模块my_fourier.cpp包含在带有main的模块中

#include "my_fourier.cpp"
#include "my_fourier.cpp"
那么这个函数

void MyFourierClass::forward_fft(int bins) {
    bins = bins + 1;

};
至少定义了两次

您应该将类定义放在头中,并且该头包含在模块中 my_fourier.cpp,其中定义了成员函数,在模块中,main从最后一个模块中删除了指令

#include "my_fourier.cpp"
#include "my_fourier.cpp"

类定义的头文件。函数定义的源文件。和
#包括
头文件,而不是源文件。您应该将
my_fourier.cpp
分为
.cpp
.h
并包括后者。谢谢!我一直认为拆分为.h和.cpp是可选的,现在可以了。谢谢!如果有人回答这个问题,我会把它标记为解决方案。这回答了你的问题吗@Xephex它是可选的,您可以
#包含任何内容,但通常情况下,环境会迫使您使用经过验证的真正的头文件和实现文件方法。任何时候,当您要编译的多个文件(无论定义是在.h还是在cpp文件中)包含函数和数据定义时,或者当智能生成系统看到cpp文件并自动编译和链接它时,您将拥有多个定义,而链接器不喜欢这样做。或者,将
forward\u fft
的定义移到类定义中。然后它变成隐式
inline
,这意味着可以多次定义它,只要每个定义都相同。或者,自己声明它
inline
。这些解决方案不像在这个答案中那样将声明和定义分开。