【问题标题】:Linker error while compiling C++ code编译 C++ 代码时出现链接器错误
【发布时间】:2009-07-16 09:47:58
【问题描述】:

首先,请原谅我对 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 * &)const 中引用" (?CreateIPrepareDecoderUnit@CLSDEnc@@ABEJAAPAUIPrepareDecoderUnit@@@Z) lsdenc.obj

谁能指点我解决这个问题?

【问题讨论】:

  • 你能标出正确的答案吗?

标签: c++ linker-errors


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    可能的问题:

    • 您没有在 .cpp 中定义构造函数
    • 您的 .cpp 中没有包含正确的标题
    • 您忘记将构造函数设为公共(类方法默认为私有)

    尝试:

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

    要使您的构造函数公开,请像这样声明类:

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

    【讨论】:

    • @Meeh: 1.) 我在代码中的任何地方都没有构造函数的定义。 2.) 构造函数在类声明中声明为public:CDecoderUnit();
    • 私有成员确实没有导出,但是在编译时检测到成员的访问,而不是在链接时。
    【解决方案3】:

    您的项目中是否包含包含方法体的源文件,例如 CDecoderUnit::CDecoderUnit()?

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        类中的默认可访问性是私有的。像这样声明你的构造函数:

        public: CDecoderUnit();
        

        【讨论】:

        • @Aamir:你是对的。感谢您向我指出这一点。 (这些天我在使用 Java。)
        • @Naween:你也是对的。似乎问题中给出的源代码与给编译器的源代码不同。问题可能在 Meeh 的列表中。
        • Aamir: 1.) 你提到的和 Jochen 的有什么区别 2.) 我在代码中找到的任何地方都没有构造函数的定义。 3.) 构造函数在类声明中声明为public:CDecoderUnit();
        • @goldenmean: 1) 这是网络媒体的诅咒:我在回复中忘记了冒号,并在阿米尔回复后插入了冒号。 2)问题中没有显示实现文件,因此很难判断是否缺少ctor的定义。
        猜你喜欢
        • 2015-10-17
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 2020-07-04
        • 1970-01-01
        相关资源
        最近更新 更多