【问题标题】:C++ LNK2019 error with constructors and destructors in derived classes派生类中的构造函数和析构函数的 C++ LNK2019 错误
【发布时间】:2011-02-14 13:31:30
【问题描述】:

我有两个类,一个继承自另一个。编译时出现以下错误:

Entity.obj:错误 LNK2019:未解析的外部符号“public:__thiscall Utility::Parsables::Base::Base(void)”(??0Base@Parsables@Utility@@QAE@XZ) 在函数“public”中引用: __thiscall Utility::Parsables::Entity::Entity(void)" (??0Entity@Parsables@Utility@@QAE@XZ)

Entity.obj:错误 LNK2019:函数中引用了未解析的外部符号“public:virtual __thiscall Utility::Parsables::Base::~Base(void)”(??1Base@Parsables@Utility@@UAE@XZ) "public: virtual __thiscall Utility::Parsables::Entity::~Entity(void)" (??1Entity@Parsables@Utility@@UAE@XZ)

D:\Programming\Projects\Caffeine\Debug\Caffeine.exe : 致命错误 LNK1120: 2 unresolved externals

我真的不知道发生了什么.. 谁能看到我做错了什么?我正在使用 Visual C++ Express 2008。这是文件..

“include/Utility/Parsables/Base.hpp”

#ifndef CAFFEINE_UTILITY_PARSABLES_BASE_HPP
#define CAFFEINE_UTILITY_PARSABLES_BASE_HPP

namespace Utility
{
 namespace Parsables
 {
  class Base
  {
  public:
   Base( void );
   virtual ~Base( void );
  };
 }
}

#endif //CAFFEINE_UTILITY_PARSABLES_BASE_HPP

“src/Utility/Parsables/Base.cpp”

#include "Utility/Parsables/Base.hpp"

namespace Utility
{
 namespace Parsables
 {
  Base::Base( void )
  {
  }

  Base::~Base( void )
  {
  }
 }
}

“include/Utility/Parsables/Entity.hpp”

#ifndef CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP
#define CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP

#include "Utility/Parsables/Base.hpp"

namespace Utility
{
 namespace Parsables
 {
  class Entity : public Base
  {
  public:
   Entity( void );
   virtual ~Entity( void );
  };
 }
}

#endif //CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP

“src/Utility/Parsables/Entity.cpp”

#include "Utility/Parsables/Entity.hpp"

namespace Utility
{
 namespace Parsables
 {
  Entity::Entity( void )
  {
  }

  Entity::~Entity( void )
  {
  }
 }
}

【问题讨论】:

  • 项目中是否包含所有这些文件?你看到他们编译了吗?
  • 是的,它们都包含在内并且可以正常编译。
  • 尝试摆脱命名空间
  • 只是 ac & p 的一个答案,我发布了一点:“我刚刚检查并记住了一些东西,我有两个文件都名为 Base.cpp,但它们位于不同的目录中。我看到一个编译,但不是两个。这可能是问题吗?”
  • @BLH 当然。首先要做的是确定你在链接什么。重命名任何可疑文件,并检查结果。

标签: c++ inheritance constructor destructor lnk2019


【解决方案1】:

相关位是这样的:

unresolved external symbol "public: __thiscall Utility::Parsables::Base::Base(void)"

您需要为Base::BaseBase::~Base 提供定义。声明不够好。即使你在任何一个函数中都无事可做,你也需要留下一个空的函数体,因为 C++ 实际上要求函数存在。 C++ 将虚拟表维护之类的东西放在你的构造函数和析构函数中,所以即使你不需要在那里做任何事情,也必须定义它们——C++ 必须在那里做事情。

您确定 Base.cpp 包含在构建中吗?

【讨论】:

  • 我的源文件中确实有定义,正如你所描述的,我留下了一个空的函数体。
  • @BLH:再次阅读我的最后一句话 :)(我编辑了答案,即使它看起来不是那样)
  • 我刚刚检查并记住了一些东西,我有两个名为 Base.cpp 的文件,但它们位于不同的目录中。我看到一个编译,但不是两个。会不会是这个问题?
  • @BLH:是的,可以。默认情况下,AFAIK VS 将其目标文件转储到单个目录中,每个文件都以产生它的源文件命名。那么一个人可能会覆盖另一个人。
  • @BLH 最好不要有复杂的目录结构(或复杂的命名空间方案)——它们总是会带来麻烦,尤其是在移植代码时。
【解决方案2】:

今天在 Visual Studio 2015 中遇到了同样的错误。不幸的是,接受的答案不起作用(以及许多相同问题的答案)。对我有用的是右键单击基类 cpp 文件,排除然后再次包含它。我认为 VS 在移动文件和重命名时不知何故感到困惑,它只是默默地拒绝编译它,即使它在属性编辑器中标记为“包含在项目中”= true 以及在组中的 vcproj 文件中列出。这是一个可怕的错误,最终花费了很多时间。

【讨论】:

    【解决方案3】:

    您的 base.cpp 没有被编译/链接,或者您的拼写错误

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2015-04-16
      • 2014-08-08
      • 2015-08-18
      相关资源
      最近更新 更多