免费注册 查看新帖 |

Chinaunix

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

用dlopen加载的函数/类中,调用其他函数,提示找不到函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-18 20:05 |只看该作者 |倒序浏览
本帖最后由 深蓝苹果 于 2012-01-18 20:07 编辑

提示信息是:
symbol lookup error: ./lib/demo/libdemo.so: undefined symbol: frame_read


执行次序是:

1.workMain 中定义了frame_read()
2.workMain 调用dlopen加载so,
3.workMain 通过dlsym获取so中的一个foo()函数来执行
4.在foo()中调用了workMain 的函数frame_read(),这时错误提示出现

(这么做的目的是,workMain只提供调用和一些基本操作,不提供逻辑,workMain与so之间只通过frame_read()交互,编译时头文件不相互引用,尽量减少编译/运行的耦合)


workMain /so是单独编译的,so用extern “C” 方式提供foo()给workMain 调用,workMain 中的frame_read()在so中用extern声明


===========================================万能的分隔线,下面是执行情况,run function output (null) 是so中的输出,表示已经调用到了so的foo()函数


root@CentOS:/data/release/wp# ./workMain
run function output (null)
./workMain: symbol lookup error: ./lib/demo/libdemo.so: undefined symbol: frame_read
root@CentOS:/data/release/wp# nm workMain | grep frame_read
0000000000401a58 t _GLOBAL__I_frame_read
000000000040292a T frame_read
root@Tencent64:/data/release/wp#

论坛徽章:
0
2 [报告]
发表于 2012-01-19 08:27 |只看该作者
头文件不互相引用?引用头文件跟写 extern foo(); 有什么区别?本质是一样的,写两次反而还容易出错。

如果真的想解耦合,那么应该在so中提供接口,由外部将frame_read的函数指针传进去,内部只调用函数指针,这样才是更好的解耦合

如果要想达到你现在的效果,那么主函数链接时加个 -rdynamic 参数吧,具体 man dlopen

      External references in the library are resolved using the libraries in that library’s dependency list and any other libraries
       previously  opened  with  the  RTLD_GLOBAL  flag.   If the executable was linked with the flag "-rdynamic" (or, synonymously,
       "--export-dynamic"), then the global symbols in the executable will also be used  to  resolve  references  in  a  dynamically
       loaded library.

论坛徽章:
0
3 [报告]
发表于 2012-02-13 09:53 |只看该作者
嗯,试验了 -rdynamic ,有效~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-12-10 15:16 |只看该作者
回复 2# drangon


    感谢,终于找到解决方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP