首页新闻找找看学习计划

如何在linux下在C++中显式调用C++的动态链接库

0
悬赏园豆:10 [已解决问题] 解决于 2015-08-10 17:37

linux下调用c++动态链接库,都必须使用dlopen函数。但是,此函数使用的话要求被调用的动态链接库中的符号定义必须是C标准的,也就是说,如果我的源文件中的函数定义必须添加

extern “C”

有没有一种机制,可以直接调用C++标准符号定义的动态链接库文件?

PaulWeiHan的主页 PaulWeiHan | 初学一级 | 园豆:200
提问于:2015-08-10 16:16
< >
分享
最佳答案
1

你说的是动态调用动态链接库,这个对是否有 extern "C"限定符没有要求,加不加都一样。你的问题是没找对导出函数的符号名称。因为不加 extern "C"的情况下,由于 C++ 允许重载,那么生成的符号名是原函数名追加上一些额外的信息的奇怪字符串,你可以查看下动态链接库的导出符号来得到实际的符号名。

收获园豆:10
Launcher | 高人七级 |园豆:45030 | 2015-08-10 16:25

您说的我知道,但如何查看导出符号并且对其进行调用呢?

PaulWeiHan | 园豆:200 (初学一级) | 2015-08-10 16:31

@PaulWeiHan: 我说之前你如果都知道的话,那么你提的问题就该是“在 linux 下如何查看动态链接库的导出函数列表?”。

http://blog.chinaunix.net/uid-192452-id-3452321.html

http://blog.csdn.net/wangweixaut061/article/details/7164809

Launcher | 园豆:45030 (高人七级) | 2015-08-10 16:54

@Launcher: 可我的目的不是查看函数列表,而是实现调用。直接用objdump打开二进制文件是可以看到函数列表。但也不能让dlsym函数调用到对应函数。所以我问的是有没有一种机制,可以调用C++标准符号定义的的动态链接库。

PaulWeiHan | 园豆:200 (初学一级) | 2015-08-10 17:03

@PaulWeiHan: 函数列表是啥,贴出来?

Launcher | 园豆:45030 (高人七级) | 2015-08-10 17:07

@Launcher: 这个是为了方便后期C++插件添加才想到的问题,插件以动态链接库的形式加载到系统中。暂时还没有具体的列表。

PaulWeiHan | 园豆:200 (初学一级) | 2015-08-10 17:11

@Launcher: 和具体的函数有关系么。。。

PaulWeiHan | 园豆:200 (初学一级) | 2015-08-10 17:14

@PaulWeiHan: 有啊,因为函数名称变了。假设你有个导出函数为 int PaulWeiHan(int x,int y),你加了 extern "C" ,那么动态调用时使用 “PaulWeiHan” 取函数地址;如果没加,那么你就需要用 “PaulWeiHan_x4dk?jdk” (这个名称是编译器生成的,不固定)取函数地址。——〉 这就是我第一次回答你,你回答我说“您说的我知道”的内容。

Launcher | 园豆:45030 (高人七级) | 2015-08-10 17:24

@Launcher: 谢谢,我理解您的意思了,您是说我拿到函数列表,做字符串匹配的,得到对应的符号,然后再调用。谢谢。

PaulWeiHan | 园豆:200 (初学一级) | 2015-08-10 17:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册