你说的是动态调用动态链接库,这个对是否有 extern "C"限定符没有要求,加不加都一样。你的问题是没找对导出函数的符号名称。因为不加 extern "C"的情况下,由于 C++ 允许重载,那么生成的符号名是原函数名追加上一些额外的信息的奇怪字符串,你可以查看下动态链接库的导出符号来得到实际的符号名。
您说的我知道,但如何查看导出符号并且对其进行调用呢?
@PaulWeiHan: 我说之前你如果都知道的话,那么你提的问题就该是“在 linux 下如何查看动态链接库的导出函数列表?”。
@Launcher: 可我的目的不是查看函数列表,而是实现调用。直接用objdump打开二进制文件是可以看到函数列表。但也不能让dlsym函数调用到对应函数。所以我问的是有没有一种机制,可以调用C++标准符号定义的的动态链接库。
@PaulWeiHan: 函数列表是啥,贴出来?
@Launcher: 这个是为了方便后期C++插件添加才想到的问题,插件以动态链接库的形式加载到系统中。暂时还没有具体的列表。
@Launcher: 和具体的函数有关系么。。。
@PaulWeiHan: 有啊,因为函数名称变了。假设你有个导出函数为 int PaulWeiHan(int x,int y),你加了 extern "C" ,那么动态调用时使用 “PaulWeiHan” 取函数地址;如果没加,那么你就需要用 “PaulWeiHan_x4dk?jdk” (这个名称是编译器生成的,不固定)取函数地址。——〉 这就是我第一次回答你,你回答我说“您说的我知道”的内容。
@Launcher: 谢谢,我理解您的意思了,您是说我拿到函数列表,做字符串匹配的,得到对应的符号,然后再调用。谢谢。