Chinaunix

标题: 用dlopen加载的函数/类中,调用其他函数,提示找不到函数 [打印本页]

作者: 深蓝苹果    时间: 2012-01-18 20:05
标题: 用dlopen加载的函数/类中,调用其他函数,提示找不到函数
本帖最后由 深蓝苹果 于 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#


作者: drangon    时间: 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.

作者: 深蓝苹果    时间: 2012-02-13 09:53
嗯,试验了 -rdynamic ,有效~
作者: 羽剑天涯    时间: 2015-12-10 15:16
回复 2# drangon


    感谢,终于找到解决方法




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2