0%

动态链接库 undefined symbol 问题

之前编码时使用 ACE_DLL 打开 so 动态库时,一直失败,后来打印 error 信息查看失败原因是 undefined symbol,如下所示:

发现是相关 boost 库没有链接,修改相关 CMakeLists.txt 添加相关库链接,重新编译就OK了;
后来试了下自己编写的 so 库,使用库中的class以及其中的方法时,只加了相关的头文件,没有链接相关的 so ,但是可以open成功,运行时出错。


ldd 命令查找 undefined symbol

格式:ldd [options] file   
功能:列出file运行所需的共享库
参数:

    -u    打印未使用的直接依赖项
    -d    执行重新定位并报告任何丢失的对象
    -r    对数据对象和函数执行重新定位,并报告任何丢失的对象或函数

    更多信息请看man手册

编译生成 so 库之后,执行:

1
$ ldd -r libxxx.so

查看所有的 undefined symbol,如果有未定义符号,则会有类似如下所示:

其中 zmq_ctx_new 是调用的 zmq库 的 C 函数,可以直接看到函数名;
其他四处 undefined symbol 是由于 C++ 可以进行函数重载,所以引起编译器的name mangling机制。


c++filt 命令还原函数名

c++filt : 
    C++ demangle工具

还原上述未定义符号 _ZN4chat8platform2mq13MessageSocket7ConnectEv 原始函数名:

1
$ c++filt _ZN4chat8platform2mq13MessageSocket7ConnectEv