前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++在编译中遇到符合不存在如何解决?

c++在编译中遇到符合不存在如何解决?

作者头像
程序员小王
发布2018-04-13 10:56:00
8070
发布2018-04-13 10:56:00
举报
文章被收录于专栏:架构说架构说

今日问题:symbol 不存在

: symbol lookup error: ./libinterface.so: undefined symbol:

_ZN10CMySQLItem13ExecuteDirectEPKcmi

一般是没有引用第三方库 没有编译好

今天竟然耗费如很长时间解决

记录一下

解决过程:

如何判断一个函数来源编译的那个库 并且包含在改库中 因为一个动态库引用了很多其他库 (静态库和动态库)

  1. 搜索这个函数在那个.h .cpp如何实现的

2 问题升级 很可惜现实告诉你 别人实现你是看不到代码 寻找编译动态库的makefile 确定动态库和静态库的范围

3 问题升级 如果没有makefile如何确认呢

ldd .so 方式来确认 引用那些第三方库

4 问题升级

如果是这个函数在静态库呢 ldd 不起作用 巧妇难为无米之炊 回到3 必须找到对应makfie或者其他 (暂时想到 有更好方法吗?)

5 最后确认了是静态库有问题

问题有来了

这个符合根本就么找到

问题 nm libBusinessEquipdb.so.0.1 |grep aadfdfdf 不存在符号是没有提示的 (这个必须注意) 这个傻了。 产生怀疑 全部库我都寻找一遍为啥还没有呢 必须寻找出证据来

6 为了确认别人程序编译有问题 对比历史库

采取方式是 nm xx.a |grep xxxx

nm xxx.so 对比上个版本(可以正常运行) 这个版本不可以运行差异

多出一个符号: 0000000000113620 t _ZN10CMySQLItem13ExecuteDirectEPKcm U _ZN10CMySQLItem13ExecuteDirectEPKcmi

竟然多一个i 自己没有看出来: 自己没看出来

c++支持函数重载 函数原来是2个参数 现在增加到3个参数 你竟然没有看出来 你以为自己代码 makefiel等有问题 白白浪费一天时间。

最后确认 同类重载函数 确认连接mysql静态库编译有问题

用对比工具对比nm 两个库之间差异 函数进行重载 来确认历史变化

函数原来是2个参数 现在增加到3个参数

扩展思考

问题来了 举例

A 引用B库 但是B库编有问题 是因为B没有引用c库 如何解决 A 同时引用B和C库 只要符存在就可以了

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档