【我的C/C++语言学习进阶之旅】C++编程常出现错误:Undefined Reference的一些常见情况分析

news2025/1/11 10:21:14

本教程详细介绍了程序员在 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 <iostream>

// 声明函数
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最新版网络安全图成长路线图,从零基础到精通

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

这8个实用office技巧,让你的工作效率快人一步,建议收藏保存

大家平常使用office的时候&#xff0c;有没有发现一些小技巧呢&#xff1f;我整理了8个office技巧分享给大家&#xff0c;总有一个你能用得到&#xff0c;对提高我们的工作效率很有帮助哒。技巧一&#xff1a;合并多个Word文件如果大家需要在收集资料的时候&#xff0c;需要将多…

双功能螯合剂:2374782-03-1,NOTA-FAPI-04 ,NOTA-FAPI-4

NOTA-FAPI-04&#xff0c;NTFAPI-04&#xff0c;NOTA-FAPI-4 产品规格&#xff1a; 1.CAS号&#xff1a;2374782-03-1 2.分子式&#xff1a;C36H47F2N9O8 3.分子量&#xff1a;771.8238 4.包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xf…

双向链表与DFS的Unix文件储存程序

title: 双向链表与DFS的Unix文件储存程序 date: 2021-11-28 12:39:26 tags: [链表][DFS] categories:[码农日常] 写在前面 这是一篇关于python编写的小型文件储存程序&#xff0c;旨在于模拟Unix下ls、cd等的命令&#xff0c;在整一个中文互联网世界中&#xff0c;很难找到这样…

华为云服务-运维篇-应用健康状况追踪-性能监测

文章目录前言性能监测意义应用性能监控Java 应用探针步骤一、登录虚拟机步骤二 、Java应用启动添加配置项步骤三、 APM步骤四、应用性能管理 APM步骤五、查看监控的应用性能管理相关的指标总结前言 之前的文章我们已经介绍过了华为云平台下 微服务日常如何运维。 这次我们介绍…

【响应式四端自适应】红色系网络公司网站 v2.6.1.3

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 四网合一企业网站管理系统支持在线升级&#xff08;支持跨版本&#xff09;、插件在线安装、系统内置严格的过滤体系、可以有效应对安全检测报告。 四网合一&#xff1a; 电脑网站、手机…

APIcat更新阿里云日志分析和自动拦截功能

基于OpenAPI定义进行增强HTTP日志分析的开源工具APIcat&#xff08;项目主页&#xff09;本周更新了阿里云相关功能&#xff0c;构建了从日志分析到实时拦截规则创建的整体流程。 APIcat通过阿里云Logstore功能读取日志&#xff0c;并通过SLB拦截规则创建接口实现拦截规则的自…

Qt学习之路之QMovie动画

QMovie类是一个很方便的类&#xff0c;用于播放动画。在刷新页面的时候&#xff0c;可以尝试用QMovie 来实现等待界面。 QMovie类用于显示简单的动画&#xff0c;没有声音。 首先&#xff0c;通过将一个文件的名称或者一个指针传递给QMovie的构造函数构建一个QMovie对象。传递…

[附源码]计算机毕业设计的黄河文化科普网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

@Transactional 事务获取数据源的源码解析

spring在开启事务的时候是去拿数据源的&#xff0c;今天我们详细分析一下&#xff0c;Transactional 事务获取数据源的源码解析&#xff1a; 1、从业务代码声明式事务开始&#xff1a; 接口调用到这里&#xff0c;原理是生成了动态代理类&#xff0c;默认是通过cglib实现的类…

《Linux运维实战:MongoDB数据库逻辑备份恢复(方案三)》

一、备份与恢复方案 Percona Backup for MongoDB 是一个开源、分布式和低影响的解决方案&#xff0c;用于MongoDB分片集群和副本集的一致备份&#xff0c;不支持单实例mongodb服务。从版本1.7.0开始&#xff0c;Percona Backup for MongoDB支持物理和逻辑备份和恢复&#xff0…

计算机网络—各层协议极其作用

文章目录应用层传输层网络层链路层物理层————————————————————————————————应用层 &#xff08;1&#xff09;应用层&#xff1a;直接为用户的应用进程提供服务。第三方自定义协议&#xff08;HTTP协议&#xff0c;支持电子邮件发送的SMTP协议…

Metal每日分享,LUT查找滤镜效果

本案例的目的是理解如何用Metal实现LUT颜色查找表滤镜&#xff0c;通过将颜色值存储在一张表中&#xff0c;在需要的时候通过索引在这张表上找到对应的颜色值&#xff0c;将原有色值替换成查找表中的色值; 总结就是一种针对色彩空间的管理和转换技术&#xff0c;LUT 就是一个 …

【MySQL】深入理解隔离性

文章目录多版本并发控制(MVCC)如何解决读-写并发undo 日志模拟MVCC过程select读取版本隔离性的实现为什么要有隔离级别快照(read view)可重复读(RR&#xff09;与读提交(RC&#xff09;的本质区别多版本并发控制(MVCC) 多版本并发控制(MVCC)是一种用来解决读写冲突的无锁并发控…

[附源码]计算机毕业设计教务管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java银行管理系统275d1

要开始我们毕业设计的第一步的关键就是选好我们的课题&#xff0c;有的同学开始选题的时候想着按照传统的课题延续下去&#xff0c;在设计题目时&#xff0c;不要过于笼统广泛&#xff0c;选择题目其实并不难&#xff0c;要多从自身的角度出发&#xff0c;要结合你们当前所处的…

Briefings in Bioinformatics2021 | DLGN+:基于GAN和强化学习的分子从头双目标性质生成

论文标题&#xff1a;De novo generation of dual-target ligands using adversarial training and reinforcement learning 论文地址&#xff1a;https://academic.oup.com/bib/article/22/6/bbab333/6354720 代码&#xff1a;https://github.com/lllfq/DLGN 一、模型结构 …

数学基础从高一开始3、集合的基本运算

目录 复习内容&#xff1a; 并集的概念 你能用符号语言和图形语言表示并集这个集合吗? 例1:求并集 例2&#xff1a;求并集 符号解析&#xff1a; 例3&#xff1a; 交集的概念 例4&#xff1a; 例5&#xff1a; 例6&#xff1a; 思考题&#xff1a; 作业&#xff…

20221209在Ubuntu22.04下读取苹果分区APFS的步骤

20221209在Ubuntu22.04下读取苹果分区APFS的步骤 缘起&#xff1a;公司的新来的美工要清理MAC电脑。 由于忘记管理员密码&#xff1f;于是备份文件&#xff0c;重装系统&#xff01; 于是通过固态硬盘盒子将2TB的M2接口的固态硬盘SSD格式化为APFS&#xff0c;这样MAC电脑就可…

2022下半年软考成绩即将公布,预约查分提醒,查分快人一步

距离2022下半年考试已经过去一个多月了&#xff0c;大家都在焦急的等待软考成绩查询。根据往年情况来看&#xff0c;软考成绩查询时间并不是固定的一个时间点&#xff0c;不过可以大致预测下应该是在12月中/下旬左右开放成绩查询&#xff0c;具体情况以官方公告为准。 历年软考…