【C++】undefined reference to `xxx_function’”的错误

1. undefined reference to `xxx_function’”的错误时

既然编译是说没有定义某个函数,所以我们先看看这个函数是哪一个库实现的。直接搜索编译环境的include目录,看看 xxx_function 这个函数是定义到哪一个头文件,再看看这个函数是哪个源文件实现并编译为库。假设 xxx_function 函数由 xxx.c 实现并最终编译输出为 xxx.so,接着使用readelf -d xxx.so,查看该命令输出的“Library soname:”信息,比如输出了“libxxx.so”,我们再在Makefile的LDFLAGS增加 -lxxx即可,这样编译的时候链接工具将会链接libxxx.so并查找得到xxx_function函数的符号链接成功。
有些时候是没有链接系统的某些库导致的,有时候又会是没有链接第三方库导致的,具体根据问题现象相应查找实现该函数的库,再相应的链接该库即可。

为什么会出现这样的错误呢?
我们在机器中运行一个程序,程序都是由源代码经过预编译、编译、汇编、链接四个阶段组成。

预编译
假设我们的是 .c 源文件和相关头文件,将会被与编译器 gcc 预编译为一个 .i 文件,预编译使用 -E 参数即可。预编译可以简单理解就是处理源码中已“#”开始的预编译指令,比如“#include”、“#define”等。当我们无法判断宏定义是否正确或头文件包含是否正确时,可以查看预编译后的文件来确定问题。

编译
编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。使用 - S 参数将输出为汇编文件。

汇编
汇编器就是将汇编代码转换为机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。使用 -c 参数即可,经过预编译、编译和汇编将会输出目标文件。

链接
我们看汇编代码中,经常会看到 jmp aaa_function,我们知道这个是一个跳转指令,将会跳转到 aaa_function 函数执行,aaa_function 此时是一个符号,我们在编译的时候,最终就会将可执行程序中使用的各个符号链接起来,知道运行的时候到哪里查找得到该符号,知道跳转的地址是多少。链接的过程主要包括了地址和空间分配、符号决议和重定位等这些步骤。

2. undefined reference to `xxx_function’”的错误时

遇到“undefined reference to `xxx_function’”的错误时,通常意味着链接器在链接过程中找不到某个函数的定义。以下是一些解决这类问题的步骤:

  1. 确定函数所属的库

    • 首先,确定xxx_function函数属于哪个库。可以通过搜索头文件来确定函数声明的位置,然后查找该函数是由哪个源文件实现的,以及最终编译成哪个库文件(如libxxx.solibxxx.a)。
  2. 检查库文件是否正确链接

    • 确认在编译命令或Makefile中是否已经包含了正确的库链接指令。如果是动态库,通常使用-lxxx来链接(例如-lyaml-cpp)。如果是静态库,确保.a文件的路径被包含在编译器的搜索路径中,并且使用了-l选项。
  3. 检查库文件的路径

    • 如果库文件不在标准路径下,需要确保编译器能够找到它。可以通过设置-L参数指定库文件的搜索路径。
  4. 检查头文件的路径

    • 确保编译器能够找到库的头文件。可以通过设置-I参数指定头文件的搜索路径。
  5. 检查库的版本

    • 如果库有多个版本,确保链接的是正确的版本。有时候,库的新旧版本之间可能不兼容。
  6. 检查依赖关系

    • 有些库之间存在依赖关系,确保所有依赖库都已经被正确链接。
  7. 使用readelfnm工具

    • 使用readelf -d libxxx.sonm libxxx.so来查看库文件中包含的符号,确认xxx_function是否在其中。
  8. 清理并重新编译

    • 有时候,旧的编译产物可能会导致链接错误。尝试清理(如使用make clean)项目并重新编译。
  9. 检查编译器和链接器的错误信息

    • 仔细阅读编译器和链接器的错误信息,它们通常会提供关于缺失符号的详细信息。
  10. 查看文档和社区

    • 如果上述步骤都无法解决问题,查看库的文档或者搜索社区论坛,看看是否有其他人遇到并解决了类似的问题。

《程序员的自我修养------链接、装载与库》是一本很好的书,它详细介绍了程序从源代码到可执行文件的整个编译链接过程,对于理解链接错误和解决这类问题非常有帮助。

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

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

相关文章

Qt:信号槽

一. 信号槽概念 信号槽 是 Qt 框架中一种用于对象间通信的机制 。它通过让一个对象发出信号,另一个对象连接到这个信号的槽上来实现通信。信号槽机制是 Qt 的核心特性之一,提供了一种灵活且类型安全的方式来处理事件和数据传递。 1. 信号的本质 QT中&a…

测试实项中的偶必现难测bug之模糊匹配逻辑

问题: 现在有一个场景,如果只是通过功能测试会比较难测,例如刚开始我们做会员的时候,只有白银会员,在用户分群的场景下,需要用条件逻辑匹配,当时开发用了like的匹配方式没有问题。1年后加了白银试用会员,导致在统计会员分群的时候明明条件选的是白银会员,但是统计的数…

高质量代理池go_Proxy_Pool

高质量代理池go_Proxy_Pool 声明! 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以…

Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)

Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一) Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二) 文章目录 一、RedisShake二、Cluster模式迁移 一、RedisShake RedisShake 是一个 Redis 数据…

Spring Cloud Data Flow快速入门Demo

1.什么是Spring Cloud Data Flow? Spring Cloud Data Flow 是一个用于构建和编排数据处理流水线的云原生框架。它提供了一种简化的方式来定义、部署和管理数据处理任务和流应用程序。以下是一些关键特性和组件: 关键特性 流处理: 支持实时数…

CCE-基础

背景: 虚拟化产生解决物理机资源浪费问题,云计算出现实现虚拟化资源调度和管理,容器出现继续压榨虚拟化技术产生的资源浪费,用命名空间隔离(namespace) 灰度升级(升级中不影响业务&#xff09…

[免费]SpringBoot+Vue毕业设计论文管理系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue毕业设计论文管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue毕业设计论文管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信…

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen关于inet_ntoa UDP服务器封装 系…

基于RTEMS项目学习waf build system

https://waf.io/book https://blog.csdn.net/u010312436/article/details/81093847 安装 curl -o waf https://waf.io/waf-2.0.27 chmod 755 waf 使用 函数命令 在 wscript 文件中定义函数命令 def hello(ctx):print(hello world)通过命令行调用函数 $ waf hello hello wo…

三极管工作原理,以及小电流,如何驱动大电流

因为研究【自动下载电路实现】,涉及到三极管内容,之前看过,现在回看之前的笔记,一点印象都没了,于是,想了个办法,记住它 个人联想,不喜绕道,只是帮助个人记忆的 标题也是…

干货 | WIFI7和WIFI6区别简单介绍

1、传输标准 WIFI 6使用的是11ax标准WIFI 7使用的是11be标准 2、编码方式及带宽 WIFI6使用了1024-QAM调制方式,将每个数据符号编码为10位。WIFI7使用了更高阶的4096-QAM,将每个符号编码为12位,提高了单位时间内的数据传输量。虽然更高阶的调…

React基础知识一

写的东西太多了,照成csdn文档编辑器都开始卡顿了,所以分篇写。 1.安装React 需要安装下面三个包。 react:react核心包 react-dom:渲染需要用到的核心包 babel:将jsx语法转换成React代码的工具。(没使用jsx可以不装)1.1 在html中…

沥川的算法学习笔记:基础算法(3)----高精度算法

今天学习了acwing算法基础课的高精度算法,记录下算法模版! 高精度算法在输入和输出时需要从后往前进行遍历!!! 1.高精度加法 高精度加法(add): 这个函数接受两个整数向量 A 和 B&am…

对象存储访问管理

一、前言 对象存储是一种以对象为中心的存储方式,将数据存储为对象而不是文件,在对象存储中,每个对象都有唯一的标识符,这个标识符是由系统自动生成的。与传统文件系统不同,对象存储中不需要使用文件夹或路径来查找对…

富格林:总结安全交易出金策略

富格林指出,除了现货黄金之外,现货白银也是一种非常受欢迎的交易产品,但是选择正确的交易策略可以决定交易的成败。在选择交易策略时,需要考虑许多因素,并且要掌握正确的做单技能,安全提高盈利出金。接下来…

【Java】二叉树:数据海洋中灯塔式结构探秘(上)

个人主页 🌹:喜欢做梦 二叉树中有一个树,我们可以猜到他和树有关,那我们先了解一下什么是树,在来了解一下二叉树 一🍝、树型结构 1🍨.什么是树型结构? 树是一种非线性的数据结构&…

Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码

前言 本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01 接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码 如何在指定范围内查询。从lucene 7 开始,filter 被弃用,导致无法进行调节过滤。 TermInSetQuery 指定…

xiaolin coding 图解网络笔记——HTTP篇

1. HTTP 是什么? HTTP 是超文本传输协议(HyperText Transfer Protocol),一个用在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的【约定和规范】。 2. HTTP 常见的状态码有哪些? …

AI在虚拟展厅的应用有哪些?有何优势?

AI(人工智能)与虚拟展厅的结合为展览行业带来了革命性的变革。以下是AI在虚拟展厅中的应用及其带来的优势: 一、AI在虚拟展厅中的应用 1、智能导览与讲解 AI技术可以创建虚拟数字人作为导览员,为参观者提供个性化的导览服务。 …

Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三)

Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三) py2neo 删除 1、连接数据库 from py2neo import Graph graph Graph("bolt://xx.xx.xx.xx:7687", auth(user, pwd), nameneo4j)2、删除节点 # 删除单个节点 node graph.node…