【我的C/C++语言学习进阶之旅】C++编程常出现错误:Undefined Reference的一些常见情况分析
创始人
2024-04-20 03:35:50
0次

本教程详细介绍了程序员在 C++ 中经常遇到的严重错误,如:

  • Undefined reference
  • Segmentation fault (core dumped)
  • Unresolved external symbol

我们将讨论我们在C ++中经常遇到的最重要的错误确实至关重要。除了不时发生的系统以及语义错误和异常外,我们还会得到其他影响程序运行的关键错误。

这些错误主要发生在程序结束时在运行时。有时该程序会提供正确的输出,然后发生错误。我们讨论一下Undefined reference

一、Undefined reference

当我们在程序中引用对象名称(类、函数、变量等)并且链接器在尝试在所有链接的目标文件和库中搜索它时找不到它的定义时,就会发生“Undefined reference 未定义的引用”错误.

因此,当链接器找不到链接对象的定义时,它会发出“Undefined reference 未定义引用”错误。从定义中可以清楚地看出,此错误发生在链接过程的后期阶段。导致“未定义引用”错误的原因有多种。

我们在下面讨论其中一些原因:

1.1 没有为对象提供定义

这是导致“Undefined reference”错误的最简单原因。程序员只是忘记了定义对象。

考虑以下 C++ 程序。这里我们只是指定了函数的原型,然后在主函数中使用它。

我们在VSCode中,编写一个名为main.cpp的代码,如下所示:

#include // 声明函数
int func1();int main()
{// 调用函数func1();
}

编译出错,如下所示:
在这里插入图片描述
因此,当我们编译这个程序时,会发出“undefined reference to `func1()'”的链接器错误。

为了消除这个错误,我们通过提供函数 func1 的定义来更正程序如下。现在程序给出了适当的输出,如下所示:

在这里插入图片描述

1.2 使用对象的错误定义(签名不匹配)

“undefined reference”错误的另一个原因是我们指定了错误的定义。我们在我们的程序中使用任何对象,它的定义是不同的。

考虑以下 C++ 程序。这里我们调用了 func1()。它的原型是int func1()。但它的定义与其原型不符。如我们所见,函数的定义包含函数的参数。

这样程序编译时,由于原型和函数调用匹配,编译成功。但是,当链接器试图将函数调用与其定义链接起来时,它发现了问题并发出“undefined reference”错误。

在这里插入图片描述
因此,为了防止此类错误,我们只需交叉检查所有对象的定义和用法是否与我们的程序匹配。

1.3 目标文件未正确链接

此问题还可能导致“undefined reference”错误。在这里,我们可能有多个源文件,我们可能会独立编译它们。当这样做时,对象没有正确链接,并导致“undefined reference”。

考虑以下两个 C++ 程序。在第一个文件中,我们使用了在第二个文件中定义的“print()”函数。

当我们分别编译这些文件时,

第一个文件为因为找不到 func1函数而报错“undefined reference”

main.cpp使用second.cpp里面定义的func1函数因为单独编译找不到,从而报错
在这里插入图片描述

在这里插入图片描述

而第二个文件因为找不到main 函而报错“undefined reference”

在这里插入图片描述

解决此错误的方法是同时编译这两个文件,比如VSCode的话可以参考下面的博客进行设置:

  • vscode编译多文件的方法(C和C++通用)
  • GCC 同时编译多个 C/C++ 文件

除了已经讨论过的原因外,“undefined reference”也可能由于以下原因而发生。

1.4 错误的项目类型

当我们在 Visual Studio 等 C++ IDE 中指定错误的项目类型并尝试执行项目不期望的事情时,我们会得到“undefined reference”。

1.5 没有库

如果程序员没有正确指定库路径或完全忘记指定它,那么我们会得到一个“undefined reference”,用于程序从库中使用的所有引用。

1.6 依赖文件未编译

程序员必须确保我们事先编译了项目的所有依赖项,以便在编译项目时编译器找到所有依赖项并编译成功。如果缺少任何依赖项,则编译器会给出“undefined reference”。

1.7 还有很多其他原因

除了上面讨论的原因外,“未定义引用”错误还可能在许多其他情况下发生。但最重要的是程序员弄错了,为了防止这个错误,他们应该被纠正。

1.8 之前的一些情况

  • 【我的OpenGL学习进阶之旅】解决NDK使用OpenGL ES 3.0 的api报错:error: undefined reference to ‘glUnmapBuffer‘
  • 【我的C/C++语言学习进阶之旅】在Android Studio里面把部分cpp代码抽出去为单独的cpp类,然后就会出现“undefined reference to“ 问题
  • 【我的C/C++语言学习进阶之旅】使用stb_image库时候报错 multiple definition of ‘stbi_xxxxx‘ 和 previous definition here

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...