今日问题:symbol 不存在
: symbol lookup error: ./libinterface.so: undefined symbol:
_ZN10CMySQLItem13ExecuteDirectEPKcmi
一般是没有引用第三方库 没有编译好
今天竟然耗费如很长时间解决
记录一下
解决过程:
如何判断一个函数来源编译的那个库 并且包含在改库中 因为一个动态库引用了很多其他库 (静态库和动态库)
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库 只要符存在就可以了