所以我作为一个小项目写了一个压力测试。最初,为了节省时间,我只是在头文件中填写代码。我决定组织一下,将所有内容移动到.cpp文件然后编写头文件,但VS2010向我提供了一个我无法解决的LNK2019。
FSTRESS.cpp (未包含代码,因为我怀疑它是否相关;询问您是否需要它)
FSTRESS.h
Main.cpp的
错误:
error LNK2019: unresolved external symbol "public: static void __cdecl FSTRESS::Start(unsigned int,unsigned int,unsigned int)" (?Start@FSTRESS@@SAXIII@Z) referenced in function _main C:\Programming\C++\FLOPS_Test\FSTRESS\FSTRESS\main.obj FSTRESS_Mk.II
有关为何发生这种情况的任何想法?我有点像C ++菜鸟。 感谢您的帮助:))
答案 0 :(得分:2)
您的 .cpp 文件未定义与您在 .h 中声明的类相同的类,但创建的名称与声明的名称相同在标题中。正确的方法是:
标题文件:
class Foo
{
void Bar();
};
实施档案:
void Foo::Bar()
{
// Do something
}
或者,您可以在标题文件本身中声明函数内联
class Foo
{
void Bar()
{
// Do something
}
};
在后一种情况下,不需要创建单独的实现文件。实际上,这正是你在 fstress.cpp 中所做的,但是你在 fstress.h 中提供了一个重复的声明,而没有在任何地方实际定义该类。
答案 1 :(得分:1)
因此,您实际上有两个单独的x86
和FSTRESS
类定义,一个在头文件中,一个在.cpp
文件中。如果定义相同,但您不允许这样做 - .cpp
文件中的那个有一堆内联代码,而不是头文件中的那个。 (查看"一个定义规则"有关此内容的更多信息。)
你真正想做的就是这个。你的头文件很好(或者,至少,我没有看到任何明显错误的文件)。 .cpp
文件应该(1)#include
头文件,然后(2)提供成员函数的定义,如下所示:
static void FSTRESS::Start(unsigned aMode, unsigned aTest, unsigned aThreads) {
// code goes here
}
(当你有一个源文件和一个相应的头文件时,源文件应该总是#include
头文件。这有助于确保如果出现不一致,它会在编译时被整齐地抓住时间。我无法判断你是否已经这样做了,因为FSTRESS.cpp
的顶部在你的屏幕截图中是不可见的。将代码发布为文本可能更好: - )。)
顺便说一句,不要使用以下划线开头的名称。这些名称的大部分空间是"保留",这意味着C ++实现可以在内部使用它们,如果你的使用与它的使用冲突,可能会发生坏事。最好只是为了避免这些,因为这样你就不必记住确切的规则,也没有其他人阅读你的代码。
答案 2 :(得分:1)
您不能只将类声明的内容与头文件中的内联代码粘贴到.cpp文件中,并期望它能够正常工作。当您将它与类声明分开时,FSTRESS::Start()
的实现需要更像以下内容:
void FSTRESS::Start(unsigned _aMode, unsigned _aTest, unsigned _aThreads)
{
//...
}
此外,您应该在FSTRESS.cpp文件中#include "FSTRESS.h"
,以便完全声明每个人都使用的类(包括FSTRESS.cpp中的实现位)。