您尚未登录。

楼主 # 2021-11-16 16:05:51

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 595
积分: 525
个人网站

Linux下如何通过dlopen和dlsym使用C++编译好的so动态库中的类

通常,动态库链接我们都是在编译时候就指定链接位置和链接库的名字。这个方式叫做隐式调用,最简单也是通常我们经常用到的一个方式。

但是往往 ,我们在做支持扩展插件so或者其他特殊应用的时候,会用到Linux提供的加载动态链接库的api ,就是dlopen dlsym dlclose dlerror等。

使用api 我们能够无需事先知道链接库的名字,只有程序在运行要用到动态链接库的时候,就去指定的插件目录查找存在的so文件,然后加载就好,只要提供插件的函数名和我们预期一样,那么就能够准确调用并运行得到自己想要的结果。这个方法在c 语言编译生成的动态链接库使用起来一点问题都没有

但是,在c++编译生成的动态链接库就不一样了,一个是c++支持函数重载,动态库中的名字是加入了标志着函数参数信息的magic字符。这个会导致我们在dlsym的时候,根本无法获取到对应的我们命名的函数。好在只要我们只要对函数符号进行查找,一样是能够解决这个问题的。 最最麻烦的问题是使用到了动态链接库的类,还有类的成员函数,我们在程序中要实例化类,对类的函数进行调用,拿到类的成员等等,到这一步就非常难搞了.....

有没有大佬能够指点一下,怎么才能够解决这个问题?

注:目前最麻烦的是插件的动态库不是自己编译的,无法通过加入一些函数来在动态库内部实例化类返回指针这种形式解决

最近编辑记录 微凉VeiLiang (2021-11-16 17:17:14)

离线

楼主 #4 2021-11-16 17:14:38

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 595
积分: 525
个人网站

Re: Linux下如何通过dlopen和dlsym使用C++编译好的so动态库中的类

@armstrong
是最适合c。C++不知道linux后面会不会加入这种方面的支持
有个做法就是在动态库里面提供对应的类的创建和销毁函数,然后动态库里面实例化和销毁。在创建时候返回的是类的地址,然后自己在外部定义一个同样的类,根据地址偏移进行操作(不知道是否准确,有点c语言结构体的思维了,类的对象地址排布好像也是一样的吧)
现在由于不能修改dll,好像这个办法就行不通了

离线

楼主 #5 2021-11-16 17:16:40

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 595
积分: 525
个人网站

Re: Linux下如何通过dlopen和dlsym使用C++编译好的so动态库中的类

@armstrong
感谢,我去学习下看看。不过好像和上面说的方式类似。windows下dll不知道有没有类似问题的解决方案

离线

楼主 #8 2021-11-18 09:38:19

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 595
积分: 525
个人网站

Re: Linux下如何通过dlopen和dlsym使用C++编译好的so动态库中的类

cgpsky 说:

一样可以,类似于组件(plugin)加载,明天附上代码

感谢,蹲代码(:

离线

楼主 #9 2021-11-18 09:39:38

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 595
积分: 525
个人网站

Re: Linux下如何通过dlopen和dlsym使用C++编译好的so动态库中的类

Fomalhaut 说:

先引用原有的头文件,用C++封装一层,然后导出C接口。

有参考的实例么

离线

楼主 #12 2021-11-22 20:03:34

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 595
积分: 525
个人网站

Re: Linux下如何通过dlopen和dlsym使用C++编译好的so动态库中的类

@cgpsky
看上去好像还是要求dll有除了构造函数之外的,能够返回实例化好类地址的成员函数。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn