编译C ++代码时链接器错误

时间:2009-07-16 09:47:59

标签: c++ linker-errors

首先,请原谅我对C ++的了解不足。我是一个真正的初学者!

我正在尝试在MS VS2005上编译一个C ++代码。我在下面的代码中收到如下链接器错误: -

在一个函数(某种类方法)定义中,它具有内存分配代码,如:

CDecoderUnit *du = new CDecoderUnit(); //<<error is shown at this line 

此CDecoderUnit是在头文件中定义的类,如

class CDecoderUnit : public IPrepareDecoderUnit
{
   CDecoderUnit();
   ~CDecoderUnit();
...
...
other class definition.

..
..
}

实际错误是: -

  

错误LNK2019:未解析的外部符号“public:__thiscall CDecoderUnit :: CDecoderUnit(void)”(?? 0CDecoderUnit @@ QAE @ XZ)在函数“private:long __thiscall CLSDEnc :: CreateIPrepareDecoderUnit(struct IPrepareDecoderUnit *&amp;)”中引用const“(?CreateIPrepareDecoderUnit @ CLSDEnc @@ ABEJAAPAUIPrepareDecoderUnit @@@ Z)lsdenc.obj

有人能指点我解决这个问题吗?

5 个答案:

答案 0 :(得分:5)

当你写CDecoderUnit();时,你正在做两件事:

  • 声明默认构造函数(不实现它,只是声明它)。
  • 导致编译器自行生成默认构造函数。

如果需要初始化任何东西,你需要定义构造函数,或者删除允许编译器自己生成一个的声明。请注意,如果您确实实现了构造函数,那么如果要从类外部创建对象,则必须将其公之于众。

答案 1 :(得分:1)

可能出现的问题:

  • 您没有在.cpp
  • 中定义构造函数
  • 您没有在.cpp
  • 中添加正确的标题
  • 您忘记将构造函数设为public(默认情况下类方法是私有的)

尝试:

  • 重建项目
  • 检查您是否在.cpp中包含了正确的标题(拼写!;))
  • 请记住,你的构造函数应该是这样的:.cpp
  • 中的CDecoderUnit :: CDecoderUnit(){}
  • 将公共:添加到.h中的类定义的顶部(记住要私有:为你的私有)
  • 你忘记了;在类定义之后(不要认为这是它。编译器通常会为此生成不同的错误)

要使构造函数公开,请按以下方式声明类:

class MyClass
{
public:
   //Public stuff goes here
   MyClass();
   void publicMethod();
private:
   //Private stuff goes here
};

答案 2 :(得分:1)

您是否拥有包含项目中包含的CDecoderUnit :: CDecoderUnit()等方法的方法主体的源文件?

如果是这样,请检查该源文件上的属性以确保它实际上正在使用 - 右键单击​​解决方案资源管理器以选择属性并选中常规属性从生成中排除已设置没有。

线路结尾可能会出现更微妙的问题。编辑器了解不同的行结束样式,并将正确显示您的文件。编译器只能理解Windows(CR LF)样式。如果第一行是//注释,则编译器将整个文件视为已注释掉。在这种情况下,修复方法是将其另存为Windows样式 - 请参阅文件 - 高级保存选项。

答案 3 :(得分:0)

这两件事在两个不同的dll中吗?例如,如果您在一个dll中定义了CDecoderUnit并在另一个dll中创建了一个实例。如果是这种情况,则必须从第一个dll导出类,以便在另一个中创建对象。

答案 4 :(得分:-1)

类中的默认辅助功能是私有的。像这样声明你的构造函数:

public: CDecoderUnit();