C++ 中对 Class::Function() 的未定义引用

Muhammad Husnain 2023年10月12日
  1. C++ 中的错误类型
  2. C++ 中对 Class::Function() 的未定义引用
  3. 由于 C++ 中没有函数定义,解决对 Class::Function() 的未定义引用
  4. 由于 C++ 中没有链接的对象文件,解决对 Class::Function() 的未定义引用
  5. 由于未在 C++ 中编译相关文件,解决对 Class::Function() 的未定义引用
C++ 中对 Class::Function() 的未定义引用

本教程简要讨论了 C++ 编程中最常见且同样严重的错误之一(即未定义对 Class::Function() 的引用)。

首先,我们将简要讨论在 C++ 中编码时的不同错误。然后,我们将解释未定义引用错误的原因和解决方法。

C++ 中的错误类型

与任何其他编程语言一样,由于多种原因,C++ 代码可能会出现错误或错误。这些错误大致分为以下错误类别:

  • 语法错误是由于违反 C++ 规则或任何语法而发生的错误。
  • 运行时错误是在语法上没有编程问题但在执行时检测到并导致程序崩溃时发生的错误。
  • 当我们没有得到我们想要的结果或输出时,就会发生逻辑错误,这意味着我们的程序逻辑中存在错误。
  • 链接器错误是程序成功编译并尝试将其他一些对象与我们的主对象文件链接时的错误类型,因此不会生成可执行文件。例如,定义的函数的任何错误原型、包含的任何不正确的头文件等。

C++ 中对 Class::Function() 的未定义引用

这是 C++ 中最常发生的错误,并且同样重要,尤其是对于新程序员而言。这种类型的链接器错误会影响程序的运行。

这些错误主要发生在程序编译成功并且处于链接阶段试图将其他目标文件与主目标链接时。在某些情况下,程序会给出一些输出,并且会发生此错误。

因此,追踪和纠正此类错误有时会很复杂。

当我们使用了对某个类、函数或变量的任何引用时,就会发生未定义的引用错误。链接器无法在所有链接的目标文件和库中找到它的定义,从而产生错误 Undefined Reference to a Class::Function()

这些错误可能有多种原因,但我们将在这里讨论其中的一些。

由于 C++ 中没有函数定义,解决对 Class::Function() 的未定义引用

这可能是导致此错误的最直接原因,因为你提供了函数的原型但忘记给出其定义。

当你为该函数创建引用时,链接器将无法找到其定义,从而生成错误 Undefined Reference to a Class::Function()

这在下面的示例中得到了证明:

#include <iostream>
class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box

  double getArea(void);
};
int main() {
  Square sq1;
  sq1.getArea();
  return 0;
}

输出:

(.text+0x15): undefined reference to Square::getArea()
collect2.exe: error: ld returned 1 exit status

由于 C++ 中没有链接的对象文件,解决对 Class::Function() 的未定义引用

当使用不同的文件来定义一个类时,我们需要将该文件包含在主函数文件中,以便在链接程序时与主对象文件链接。

在下面的示例中,我们在另一个文件中单独定义了 Square 类。在主文件中,我们引用了它的对象,所以它会给出一个未定义的引用错误,因为文件没有链接。

例子:

#include <iostream>
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

示例(Square.cpp):

class Square {
 public:
  double length;  // Length of a box
  double width;   // Breadth of a box
  double height;  // Height of a box
  double getArea(void) { return length * width; }
  void setLength(double l) { length = l; }
};

解决这个问题的方法是将 Square.cpp 文件链接到以下代码中的主文件。

#include <iostream>

#include "square.cpp"
using namespace std;

int main() {
  Square sq1;
  cout << sq1.getArea();
  return 0;
}

由于未在 C++ 中编译相关文件,解决对 Class::Function() 的未定义引用

当程序的所有依赖项都没有成功编译时,也会出现这种类型的错误。为了使链接器成功生成可执行文件,有必要在启动链接阶段之前编译所有依赖项。

这是不可避免的,因此链接器可以轻松找到所有相关的目标文件(即 .o 文件)。如果任何依赖对象文件丢失,链接器将生成未定义引用错误。

注意
如果你使用 GNU 的 g++ 编译器,Bash 命令 g++ -c abc.cpp 将在不调用链接器的情况下生成相应的目标文件 abc.o

除了上面讨论的情况之外,未定义的参考错误可能还有许多其他情况。程序员必须正确定义所有标识符(例如,函数、变量和对象)以避免此类问题。

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

相关文章 - C++ Error