当前位置: 技术问答>linux和unix
关于动态链接库
来源: 互联网 发布时间:2015-08-26
本文导语: 主程序里定义了一个父类, 同时生成了另外一个动态链接库, 里面定义了一个子类,继承了父类 主程序运行时,用dlopen("xxx.so", RTLD_LAZY)打开这个动态链接库时,出错: xxx.so: undefined symbol: __ti15CAppLevelParser. CAppLevelParser就...
主程序里定义了一个父类,
同时生成了另外一个动态链接库, 里面定义了一个子类,继承了父类
主程序运行时,用dlopen("xxx.so", RTLD_LAZY)打开这个动态链接库时,出错:
xxx.so: undefined symbol: __ti15CAppLevelParser.
CAppLevelParser就是主程序里定义的父类
看了文档, 动态连接库中的external reference
有三种方法定位:
1.主程序编译时加-rdynamic选项后, 从主程序里找
2.前面打开的动态链接库,如果是RTLD_GLOBAL, 也会从前面的库里找
3.dependence list
我这里当然就是第二种了,可我加了-rdynamic还是不行啊 !!!
季度郁闷!!
恳请高手指点一二 感激不尽!!
同时生成了另外一个动态链接库, 里面定义了一个子类,继承了父类
主程序运行时,用dlopen("xxx.so", RTLD_LAZY)打开这个动态链接库时,出错:
xxx.so: undefined symbol: __ti15CAppLevelParser.
CAppLevelParser就是主程序里定义的父类
看了文档, 动态连接库中的external reference
有三种方法定位:
1.主程序编译时加-rdynamic选项后, 从主程序里找
2.前面打开的动态链接库,如果是RTLD_GLOBAL, 也会从前面的库里找
3.dependence list
我这里当然就是第二种了,可我加了-rdynamic还是不行啊 !!!
季度郁闷!!
恳请高手指点一二 感激不尽!!
|
进来学习一下
楼主的用法感觉挺怪异,呵呵,为什么不把父类定义在动态连接库中呢?不是很明白。
试试看,先把主程序编译成.o文件,用objdump看下__ti15CAppLevelParser符号是否导出了。
用readelf 看下最后的可执行文件和动态库的符号表,分别看下__ti15CAppLevelParser是否存在,及类型。
如果以上均确认的话,说明不是编译的问题,而是链接的问题,否则检查下程序和库的编译过程。
如果用静态连接试下也会有问题吗?
楼主的用法感觉挺怪异,呵呵,为什么不把父类定义在动态连接库中呢?不是很明白。
试试看,先把主程序编译成.o文件,用objdump看下__ti15CAppLevelParser符号是否导出了。
用readelf 看下最后的可执行文件和动态库的符号表,分别看下__ti15CAppLevelParser是否存在,及类型。
如果以上均确认的话,说明不是编译的问题,而是链接的问题,否则检查下程序和库的编译过程。
如果用静态连接试下也会有问题吗?
|
如果只是定义的话,只需要类的头文件吧。怎么会报这个错?
|
你的动态链接库是用C++写的么?加了extern "C"没有?
|
try all "xxx.so" with dlopen("xxx.so", RTLD_LAZY|RTLD_GLOBAL).
|
高手过招,我看不懂