之前编码时使用 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 |