linux下的c++filt 命令

本文介绍在Linux开发中如何使用c++filt命令解析C++函数的Namemangling问题,帮助开发者快速定位并解决库文件引用错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道, 在C++中, 是允许函数重载的, 也就引出了编译器的name mangling机制, 今天我们要介绍的c++filt命令便与此有关。

      对于从事linux开发的人来说, 不可不知道c++filt命令的使用。

 

      在linux开发中, 如果要调用基础模块库, 就要包含对应的头文件, 并在makefile中指定头文件路径和对应的库。

       之前我们说过了:

      1. 如果没有指定对应的头文件, 则编译会报错, 提示找不到头文件。 

      2. 如果指定了库路径, 但实际没有库, 则会报找不错库文件的错误。 

      3. 如果没有指定库路径(因各种原因啦), 则编译不会报错, 运行的时候才会报错, 提示dlopen失败。

 

      针对3中的问题, 我们之前也说过, 完全不用等到运行阶段才去发现问题, 我们可以在编译出so库后, 用ldd -r命令来找出undefined的函数名(当然也可以用nm命令), 比如用ldd -r test.so查出缺少_ZNK4Json5ValueixEPKc(这就是name mangling后的函数名), 那怎么知道这个name mangling后的名字的原函数名称呢?  我们可以大致猜测, 但这并不靠谱, 怎么办呢?c++file命令就是专门干这个的, 如下:

 

[plain]  view plain  copy
 
  1. [taoge@localhost test]$ c++filt _ZNK4Json5ValueixEPKc  
  2. Json::Value::operator[](char const*) const  

      这样, 就更清楚是哪个函数了。 然后就可以在工程中搜索了, 然后就可以找到对应的库了, 然后就可以修改makefile来指定库了, 酱紫就解决问题了

 

 

      就这样。

 

      后记: 我之前一直想找到一个从name mangling后的名字来找原函数的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值