【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…

高质量代理池go_Proxy_Pool

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

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服务器封装 系…

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

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

干货 | 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中…

对象存储访问管理

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

【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 常见的状态码有哪些? …

51c深度学习~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12491632 #patchmix 近期中南大学的几位研究者做了一项对比学习方面的工作——「Inter-Instance Similarity Modeling for Contrastive Learning」,主要用于解决现有对比学习方法在训练过程中忽略样本间相似关系…

力扣面试经典 150(下)

文章目录 二叉树的层次遍历82. 二叉树的右视图83. 二叉树的层平均值84. 二叉树的层序遍历85. 二叉树的锯齿形层序遍历 二叉搜索树86. 二叉搜索树的最小绝对差87. 二叉搜索树中第K 小的元素88. 验证二叉搜索树 图89. 岛屿数量90. 被围绕的区域91. 克隆图92. 除法求值93. 课程表9…

Web3的核心技术:区块链如何确保信息安全与共享

在互联网不断迭代的进程中,Web3被视为下一代互联网的核心发展方向,其目标是构建更加开放、安全、去中心化的数字生态。在这一过程中,区块链作为核心技术,为信息安全与共享提供了全新解决方案。本文将深入探讨区块链如何在Web3中实…

Leetcode 生命游戏

以下是上述Java代码的算法思想及其逻辑的中文解释: 算法思想 这段代码实现了LeetCode第289题“生命游戏”的解决方案。核心思想是: 利用原地修改的方式(in-place)存储下一状态的变化: 通过引入额外的状态值&#xff0…

JavaScript 中 arguments、类数组与数组的深入解析

博客主页: [小ᶻZ࿆] 本文专栏: 前端 文章目录 💯前言💯什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 💯深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性 3.2 类数组…

设计模式-创建型-抽象工厂模式

1.概念 工厂方法模式只能生产一个产品系列,抽象工厂可以生产多个产品系列 2.作用 多个具体产品组成一个产品族(产品系列),一个具体工厂负责生产一个产品族 3.应用场景 系统所需产品间由依赖关系,可以划分为同一产…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息;requests模块,发生http请求;os模块,文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时,如果不设置User - Agent,默认的…