首页 > 系统相关 >linux下的c++filt 命令查找未定义符号的函数名

linux下的c++filt 命令查找未定义符号的函数名

时间:2023-04-03 17:59:42浏览次数:58  
标签:头文件 函数 未定义 filt c++ 命令 linux

我们知道, 在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++filt命令就是专门干这个的, 如下:

 

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

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

标签:头文件,函数,未定义,filt,c++,命令,linux
From: https://www.cnblogs.com/lidabo/p/17283808.html

相关文章

  • C++17:新特性之std::optional
    考虑一个问题,C++如何实现返回多个值?如何标记其中一个bool返回值用于记录函数运行状态?我们可以通过pair或tuple实现,有以下代码:#include<iostream>#include<string>usingnamespacestd;structss{ strings; intsize;};pair<bool,ss>func2(conststring&in){......
  • C++黑马程序员——P55. 函数的分文件编写
    函数分文件编写一般有4个步骤1.创建后缀名为.h的头文件2.创建后缀名为.cpp的源文件3.在头文件中写函数的声明4.在源文件中写函数的定义 1.创建后缀名为.h的头文件右键项目的“头文件”文件夹->添加->新建项->然后中间选“头文件(.h)”,下面起个名字,添加2.......
  • vsc debug C++
    mac{"version":"0.2.0","configurations":[{"name":"(lldb)Launch","type":"cppdbg","request":"launch","program":......
  • C++:实现RAII机制
    RAII,也称资源获取即初始化,要求资源的有效期与持有资源的对象的生命期严格绑定,不会出现内存泄漏等问题。我们尝试将指针封装到RAII类中,实现自动析构。#include<iostream>usingnamespacestd;template<typenameT>classRAII{public: RAII():data(nullptr){} explic......
  • C++ Primer 第五版 第十一章 练习题编程题目答案
    https://github.com/jzplp/Cpp-Primer-Answer练习11.1map用关键字索引,是一个字典。vector用整数索引,是一个列表。练习11.2list链表vector顺序列表deque双端队列map字典set集合练习11.311.3map单词计数程序代码练习11.411.4去标点map单词计数程序代码练习11.5如果关键......
  • 【已解决】configure: error: C++ compiler cannot create executables
    1.背景 centos7在升级gccconfigure的时候出现的问题A100-01-$build#../configure--prefix=/usr/local/gcc--enable-threads=posix--disable-checking--disable-multilib--enable-languages=c,c++checkingbuildsystemtype...x86_64-pc-linux-gnucheckinghosts......
  • [C/C++] 判断电脑存储模式(大端/小端)
    C语言版本:#include<stdio.h>#include<inttypes.h>intmain(){uint32_tnum=0xaabbccdd;//字节方向:高->低,也就是aa是高字节,dd是低字节uint8_t*point=(uint8_t*)(&num);for(inti=0;i<sizeof(num);++i){......
  • c++ async future get
    #include<chrono>#include<ctime>#include<future>#include<iomanip>#include<iostream>#include<sstream>#include<string>#include<unistd.h>#include<uuid/uuid.h>std::stringget_time_now(){......
  • C++
    同名的namespace(名字空间/命名空间)有自动合并(为了声明和定义可以分开写)在项目中函数名、全局变量、结构、联合、枚举、类,非常有可能名字冲突,而名字空间就对这些逻辑空间划分(不是物理单元划分),为了解决命名冲突,C++之父为防止命名冲突给C++设计一个名注意:namespace(名字空间/......
  • [2022年蓝桥杯C/C++ A组]个人做题记录
    碎碎念欸嘿,鸽了小半年去做了一些不喜欢的事情,但兜兜转转,还是acm最香捏求和题意求\(\sum_{i=1}^n\sum_{j=1}^na_i*a_j(i!=j)\)题解感觉是去年的时候笨人唯一做满分的题……经典前缀和,设\(sum[i]=\sum_{j=i}^na[j]\),答案即为\(\sum_{i=1}^{n-1}a[i]*sum[i+1]\)#definein......