VC ++ LNK2019错误我似乎无法修复

时间:2012-07-12 21:21:49

标签: c++ visual-studio-2010 visual-c++ linker-errors unresolved-external

所以我作为一个小项目写了一个压力测试。最初,为了节省时间,我只是在头文件中填写代码。我决定组织一下,将所有内容移动到.cpp文件然后编写头文件,但VS2010向我提供了一个我无法解决的LNK2019。

FSTRESS.cpp (未包含代码,因为我怀疑它是否相关;询问您是否需要它) FSTRESS.cpp

FSTRESS.h FSTRESS.h

Main.cpp的 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 ++菜鸟。 感谢您的帮助:))

3 个答案:

答案 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)

因此,您实际上有两个单独的x86FSTRESS类定义,一个在头文件中,一个在.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中的实现位)。