undefined symbol 问题解决记录(二)

2023-11-01

昨天上车自测本模块功能稳定性,顺便pull小弟分支,帮忙一起验证。结果小包上车后无法运行,一查发现一直报
undefined symbol: XXXXXX
晚上下班后开始帮忙排查。今日记录以便后期回顾。

前两年写过一篇关于undefined symbol 问题的排查贴,但发生undefined symbol的情况有多种,一篇不足以盖全。

报错分析

undefined symbol 为 符号未定义,意味着程序的符号表中找不到这个符号。符号表是什么这里就简述一下不多说了,感兴趣可以去看一下编译原理(有空我也研究一下写个专栏博,hhh)。

先简单了解一下编译过程:
编译过程简述一下符号表的含义和作用:
在链接后,代码中的各种符号(函数、变量等)都被分配了地址,并将信息记录在符号表中。
例如:
存在一个函数 void function(int x) ,系统先在内存上分配一块内存,设地址为10010,再将函数标识符function、void关键字标识符和地址10010等信息记录到符号表中。
当符号被使用时,系统会去符号表里查询地址,通过查询到的地址去获取相应的信息来使用。

解决办法

通常undefined symbol的发生有两种情况:

  1. 找不到依赖的动态库
    这种需要看一下自己的makefile或者动态库配置文件,动态库名字或者路径是否有问题、调用的库版本是否正确。可参考我的第一篇文章。
    undefined symbol 问题解决记录(一)

  2. 能够找到依赖的动态库
    现在就来说一下这种情况的解决办法。

方法一:是否编译时链接了错误的库

在编译指令上加入:

 -Xlinker --unresolved-symbols=ignore-in-shared-libs

重新编译。若出现undefined symbol:xxx,再加上xxx的库以及正确路径等重新编译。
再运行看是否还报错。

方法二:通过报错问题库的符号表定位

找到编译好的库,输入指令查看该库的符号:

nm -g libxxx.so

符号较多,建议直接输出一个文档方便查看。
nm -g libxxx.so > symbol.txt

找到问题函数。

比如:
小弟分支编译后运行报错
符号未定义
使用 c++filt 查看符号对应的函数
c++filt
在符号表中查找对应的函数符号
log
这里发现存在相同的函数符号,两个符号的差别是一个存在标识符“ChartMsgGeneration”,一个没有这个类型标识符。

这个函数是小弟新实现的,按照代码规范要求,正常来说我们不会有同名函数。搜索其他函数符号,表里也只存在一个。回归到代码中溯源找到了问题原因。

在小弟的代码中,新写入的函数声明为类的静态成员函数,而在.cpp文件中的函数实现时,未在函数前使用父类修饰。导致在编译链接时出现两个函数符号,在调用运行时混淆。

xxx.h 文件里
namespace li_pilot {
namespace chart_engine_runtime {
class ChartMsgGeneration {
 private:
 static void GenCityLCStrategyInfoBehaviorMsg();
};
}
}
xxx.cpp 文件里
namespace li_pilot {
namespace chart_engine_runtime {
void GenCityLCStrategyInfoBehaviorMsg() {
// 代码实现
return;
}
}
}

最后在函数实现前把父类加上,重新编译后再运行,没有出现问题。(这里也是瞎,转圈找半天没发现少了父类。。根本没想到会有这样鱼唇的问题)

xxx.cpp 文件里
namespace li_pilot {
namespace chart_engine_runtime {
void ChartMsgGeneration::GenCityLCStrategyInfoBehaviorMsg() {
// 代码实现
return;
}
}
}

引申问题:为什么.cpp里 函数体没有父类修饰编译时没有报错呢?

这里又是另一个知识点了:静态成员
抽空再另外补充吧(等我福至心灵想勤快的时候),不在这里赘述了。感兴趣的同学自行百度一下。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

undefined symbol 问题解决记录(二) 的相关文章

随机推荐

  • 常见混沌系统—Lorenz模型

    1963年 Lorenz发现了第一个混沌吸引子 Lorenz系统 从此揭开了混沌研究的序幕 概念 在数学中 一个动力系统被称为自治的 当且仅当这个系统由一组常微分方程组成 并且这些方程的表达式与动力系统的自变量无关 在有关物理的动力系统中
  • zip压缩,使用org.apache.tools.zip实现zip压缩和解压

    1 使用apache的ant解压 org apache tools zip 2 引入pom
  • echarts解决X轴溢出数据,echarts中的boundaryGap属性

    xAxis type category boundaryGap false true才是正常的 data Date 注意 把这个设置为true才是正常的 如果设置为false两端没有留白 就会导致数据溢出
  • 同个局域网内SSH远程Ubuntu系统

    荣誉认证 51CTO博客专家博主 TOP红人 明日之星 阿里云开发者社区专家博主 技术博主 星级博主 微信公众号 iOS开发上架 本文由iOS开发上架原创 文章目录 前言 在Ubuntu系统下如何实现不同系统间的SSH连接 同一局域网环境
  • C++ 内存分区模型

    本阶段注意针对C 面向对象编程计算左详细讲解 探讨C 中的核心和精髓 1 内存分区模型 C 程序在执行时 将内存大方向划分为4个区域 1 代码区 存放函数体的二进制代码 由操作系统进行管理的 2 全局区 存放全局变量和静态变量以及常量 3
  • 如何实现32.5万笔/秒的交易峰值?阿里交易系统TMF2.0技术揭秘

    阿里妹导读 基于TMF 2 0关键模型 阿里交易平台实现了业务定义可视 可管 可配 今天我们来一起了解交易平台遇到的挑战 TMF2 0解决的关键问题 以及TMF 2 0的关键模型 本文作者为毗卢 阿里巴巴资深技术专家 主导设计了TMF2 0
  • jsp页面,EL表达式失效

    检查pom文件引入的依赖
  • C++ 集合

    目录 1 Vector 容器 2 Stack 栈 3 Queue 队列 4 Map 关联容器 5 Set 关联容器 C 的集合 较为简单 但容易混淆 所以总结一下 1 Vector 容器 Vector 是 C 的一种数据结构 确切的说是一个
  • Bing搜索核心技术BitFunnel原理

    1 概述 转载 Bing搜索核心技术BitFunnel原理 相似文章 guava 大数据量下的集合过滤 Bloom Filter 导语 从90年代中期开始 人们普遍认识 对于内容索引来说 文件签名技术比反向链接效果更差 最近几年必应搜索引擎
  • 应对当今的医疗器械软件测试开发挑战,如何选择测试软件

    随着计算机科学与技术的发展 计算机软件控制技术在医疗设备中的应用越来越广泛 并已成为医疗设备的核心技术之一 大到高端的大型医疗设备 如螺旋CT 核磁共振 直线加速器或全自动生化分析仪等 小到家用的电子血压计 血糖仪或微波理疗仪等 计算机软件
  • 修改python的默认版本

    如果电脑上安装了多个python环境 那么如何设置某一个版本的python为默认打开方式呢 我们尝试将2 7设置为默认的python环境 方法如下 此电脑 gt 属性 gt 高级系统设置 gt 环境变量 选择系统变量 然后点击编辑 将2 7
  • 前后端交互与接口设计学习

    目录 前言 介绍目录内容和目的 前后端交互概述 解释前后端交互的基本概念和作用 2 强调前后端分离的架构模式 2 前后端交互逻辑设计 1 讨论前后端交互的一般逻辑流程 2 探索不同的数据传输方式 3 提供实际案例加深理解 4 接口设计与文档
  • 太原理工大学python考试题总结

    已知x 1 2 3 那么x 3的值为 1 2 3 1 2 3 1 2 3 已知x 1 2 和y 3 4 那么x y的结果是 1 2 3 4 Python 不具备运行速度快的特点 具备扩展库丰富 跨平台 支持函数式编程的特点 Python是面
  • 15. 线性代数 - 克拉默法则

    文章目录 克拉默法则 矩阵运算 Hi 大家好 我是茶桁 上节课我们在最后提到了一个概念 克拉默法则 本节课 我们就来看看到底什么是克拉默法则 克拉默法则 之前的课程我们一直在强调 矩阵是线性方程组抽象的来的 那么既然我们抽象出来了 有没有一
  • 选中物体高亮显示(MR开发日志)

    业务逻辑 屏幕中央扫到物体 点亮该物体 离开物体 取消高亮 程序逻辑 射线选中物体 配合Outline Effect高亮显示物体 场景设置 下载插件Outline Effect 1 摄像机设置添加Outline Effect脚本 2 然后那
  • Linux防火墙端口

    在服务器上使用某些软件时需要开启相应的防火墙端口号 简单了解下Linux防火墙端口 防火墙策略 防火墙策略可以基于流量的源目地址 端口号 协议 应用等信息来定制 然后防火墙使用预先定制的策略规则监控出入的流量 若流量与某一条策略规则相匹配
  • strlen、strcpy、strcmp、strcat函数的实现

    目录 一 strlen函数的实现 二 strcpy函数的实现 三 strcmp函数的实现 四 strcat函数的实现 五 代码示例展示 strlen strcpy strcmp strcat四个函数都包含在 include
  • ios safari 开启无痕浏览(隐私模式)报QuotaExceededError: DOM Exception 22异常解决办法...

    检测safari是否开启无痕浏览 function var testKey test var storage window sessionStorage try storage setItem testKey testValue stora
  • 域适应(Domain Adaptation)综述

    根据李宏毅老师的视频所归纳的笔记 视频链接 https www bilibili com video BV1TL411p7Us spm id from 333 999 0 0 假设我们在训练集上训练黑底白字的手写数字集后 如下图 再把它用在
  • undefined symbol 问题解决记录(二)

    昨天上车自测本模块功能稳定性 顺便pull小弟分支 帮忙一起验证 结果小包上车后无法运行 一查发现一直报 undefined symbol XXXXXX 晚上下班后开始帮忙排查 今日记录以便后期回顾 前两年写过一篇关于undefined s