免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8271 | 回复: 10
打印 上一主题 下一主题

[函数] 一个动态链接的问题,dlsym后符号调用主函数的符号报告无法找到[解决篇] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-05 16:37 |只看该作者 |倒序浏览
我现在有个主函数 main, main里面使用了一个我自己写的类 cdse_variable_list,  然后我这个main函数在运行中会动态打开一个运算库(dlopen,dlsym),也是我自己写的algorithm.so, 并调用里面的函数calculate,把一个cdse_variable_list对象传入,这个函数里面调用了这个类的各种方法,但是现在我发现就连调一下基本的cdse_variable_list::debug方法报错误:bin/cdse_bs: relocation error: batch_algorithm_3046964144.so: undefined symbol: _ZN18cdse_variable_list5debugEv
似乎是找不到debug这个符号
因为这个符号并不是在 algorithm.so里面定义的,我赶紧nm一下实现这个类的variables.o,这个对象文件是和主函数一起编译的,可是显示_ZN18cdse_variable_list5debugEv这个符号是定义了的
请问这种情况我应该怎么解决呢,

不知道我描述清楚没有,对了补充一下,我是这么生成动态链接库文件的"g++ -fPIC -shared -lc -I /home/fox/workbench/cdse-server/cdse-main/src/include/ -o batch_algorithm_.so algorithm.cc"

[ 本帖最后由 picobsd 于 2007-2-13 09:21 编辑 ]

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
2 [报告]
发表于 2007-02-05 16:42 |只看该作者
algorithm.so没有正常连接

论坛徽章:
0
3 [报告]
发表于 2007-02-05 17:07 |只看该作者
怎么知道没有正常链接呢
我是用的dlopen 打开的这个函数库,没有问题啊
dlsym也没有返回错误啊

现在我觉得问题出在,主程序 调用 .so.然后.so引用了主程序的符号,这种往回引用出的问题

谢谢

论坛徽章:
0
4 [报告]
发表于 2007-02-05 17:35 |只看该作者
着急啊,在线等

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2007-02-05 22:53 |只看该作者
在c++中,想要使用dlsys动态调用函数,
需要一些处理。
参考:
http://bbs.chinaunix.net/viewthread.php?tid=881447
记得搜索。

论坛徽章:
0
6 [报告]
发表于 2007-02-06 09:59 |只看该作者
原帖由 lenovo 于 2007-2-5 22:53 发表
在c++中,想要使用dlsys动态调用函数,
需要一些处理。
参考:
http://bbs.chinaunix.net/viewthread.php?tid=881447
记得搜索。



非常感谢楼上的回答,但是
那个贴子我看过的,我也搜索过了
而且在看以前我就知道这个问题,已经extern C了,不然宿主函数都找不到我的so里面的函数
楼上的没看清楚我的问题
我现在的问题是宿主main能够找到so里面的函数,但是里面的函数没有办法调用宿主里面实现的类,有点往回引用的意思

现在我的解决办法是,把要调用的那个类的问件和so一起编译一次就没问题了,可是这样有点太傻了 ...
DaYuTou 该用户已被删除
7 [报告]
发表于 2007-02-06 12:29 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2007-02-06 13:09 |只看该作者
原帖由 DaYuTou 于 2007-2-6 12:29 发表
不知道我的理解对不对,楼主是把自定义类的对象指针传递给dll中的函数,然后再在函数中调用类中的成员函数.我觉得有两个方法可以解决你的问题:
1.不要用类(cdse_variable_list)来实现,用回调函数即把需要在dll中调 ...



就这是这么回事,楼上说的应该能解决
但是,我有个疑问,问什么我自定义的就不行呢??
在那个so里面我不调用自定义的,调用string 这样的类就可以呢
还有,为什么会找不到符号呢,我的宿主函数里面命名定义了这个cdse_variable_list类阿?
DaYuTou 该用户已被删除
9 [报告]
发表于 2007-02-06 13:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2007-02-09 14:27 |只看该作者
原帖由 DaYuTou 于 2007-2-6 13:47 发表
string是c/c++运行期库的标准类,每个执行模块不管是exe还是dll都会链接到一个c/c++运行期库,当然可以随意调用了.
至于你调用模块中自定义的类,为什么会在dll(或so)里面找不到,那是因为是调用模块链接dll(或so)而 ...



阁下说的有道理,可是我有个问题:
我先举个例子哈,C的

我的宿主程序通过dlopen打开一个so,dlsym中的一个func,返回一个函数指针,目前为止一切OK
然后调用这个func,
这个func中含有创建线程的函数,也就是调用了pthread_create,
编译的时候宿主程序连接了-lpthread,一切OK,如果不连接,func函数调用pthread_create出错
也就是说
1,pthread函数库不在 运行期库 里面
2,同样的方式,为什么连接pthread库就可以呢,宿主连接了pthread, 然后func中调用宿主连接的pthread库中的pthread_create,一切都没有问题啊

实在是不明白,越来越糊涂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP