linux 动态库找不到定义

用nm XXX.so 查找错误

Linux下使用nm命令排查和解决“undefined reference to ”_铁匠Smith先生的专栏-CSDN博客_linux nm t u

nm libXXXEngine.so |grep CHttpParser

              U _ZN11CHttpParser20GetCurrentHttpMethodER13http_method_t
                 U _ZN11CHttpParser26ExactResultFromHttpMsgBodyESsRSs
                 U _ZN11CHttpParser5parseESs
                 U _ZN11CHttpParserC1ESs
00000000000134e6 W _ZN5boost10shared_ptrI11CHttpParserE4swapERS2_
0000000000012e56 W _ZN5boost10shared_ptrI11CHttpParserEC1ERKS2_
0000000000012e30 W _ZN5boost10shared_ptrI11CHttpParserEC1Ev
0000000000014cda W _ZN5boost10shared_ptrI11CHttpParserEC1IS1_EEPT_
0000000000012cda W _ZN5boost10shared_ptrI11CHttpParserED1Ev
0000000000013df4 W _ZN5boost10shared_ptrI11CHttpParserEaSERKS2_
000000000001348b W _ZN5boost14checked_deleteI11CHttpParserEEvPT_
0000000000014c4c W _ZN5boost6detail12shared_countC1I11CHttpParserEEPT_
0000000000013bae W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserE11get_deleterERKSt9type_info
0000000000013b92 W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserE7disposeEv
0000000000013452 W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserEC1EPS2_
0000000000014d1e W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserED0Ev
0000000000014d5a W _ZN5boost6detail17sp_counted_impl_pI11CHttpParserED1Ev
000000000001591c W _ZNK5boost10shared_ptrI11CHttpParserEptEv
00000000000134b4 W _ZSt4swapIP11CHttpParserEvRT_S3_
000000000021ba40 V _ZTIN5boost6detail17sp_counted_impl_pI11CHttpParserEE
0000000000017420 V _ZTSN5boost6detail17sp_counted_impl_pI11CHttpParserEE
000000000021ba00 V _ZTVN5boost6detail17sp_counted_impl_pI11CHttpParserEE
0000000000017100 r _ZZNK5boost10shared_ptrI11CHttpParserEptEvE19__PRETTY_FUNCTION__

命令输出结果显示,那些报错的函数的符号 同样可以在nm里找到。

不同的是,这四个出错的函数,输出的前半部分为空。

这就是异常和问题所在!

下面我们只要对nm命令稍作了解:

nm命令还是比较简单而且强大的。它用来列出一个目标文件中的各种符号。符号的种类很多,以下是一些常见的符号类型


nm输出字符    含义
R    Read only symbol. 比如在代码中有一个const MAXDATA = 3095; 则MAXDATA就是一个Read only symbol
N    这是一个调试符号
D    这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号
T    Text段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号
U    未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型
S    未初始化的符号,比如全局变量int s;则s的符号就是此类型


nm命令的详细用法以及例子见正文。

至此,我们可以推断:动态库中有未定义的符号,说明该动态库的编译有问题,即是如下原因之一:

(1)一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接。

(2)一是使用者自己定义的函数或者全局变量没有定义。

这种问题的解决,首先就要检查动态库的makefile写的是否有问题。
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值