1

所以我正在写,作为一个小项目,压力测试。最初,为了节省时间,我只是将代码放在头文件中。我决定稍微整理一下,将所有内容移到一个 .cpp 文件中,然后编写头文件,但是 VS2010 向我提供了一个我似乎无法修复的 LNK2019。

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

FSTRESS.h FSTRESS.h

主文件 主文件

错误:

    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++ 菜鸟。谢谢你的帮助 :)

4

3 回答 3

2

您的.cpp文件未定义与您在.h中声明的类相同的类,而是创建与标头中声明的类同名的不同类。正确的方法是:

头文件:

class Foo
{
  void Bar();
};

实现文件:

void Foo::Bar()
{
  // Do something
}

或者,您可以在头文件本身中内联声明函数

class Foo
{
  void Bar()
  {
    // Do something
  }
};

在后一种情况下,无需创建单独的实现文件。事实上,这正是您在fstress.cpp中所做的,但是您在 fstress.h 中提供了一个重复的声明,没有在任何地方实际定义该类。

于 2012-07-12T21:30:47.990 回答
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++ 实现可以在内部使用它们,如果您的使用与它的使用冲突,就会发生坏事。最好避免所有这些,因为这样您就不必记住确切的规则是什么,其他人也不会阅读您的代码。

于 2012-07-12T21:31:37.880 回答
1

您不能只将带有内联代码的类声明的内容从头文件粘贴到 .cpp 文件中并期望它能够工作。当你将它与类声明分开时,它的实现FSTRESS::Start()需要看起来像下面这样:

void FSTRESS::Start(unsigned _aMode, unsigned _aTest, unsigned _aThreads)
{
    //...
}

此外,您应该#include "FSTRESS.h"在 FSTRESS.cpp 文件中准确地声明每个人都使用的类(包括 FSTRESS.cpp 中的实现位)。

于 2012-07-12T21:32:19.183 回答