linux动态库so的运用

so文件的运用在C和C++变成中运用的非常广泛,以下博文是我的使用心得。


一.so的静态加载

在gcc(或者g++)中使用-l 参数在编译器加载so文件。这样的使用场景,应用程序必须要有于so一同发布的h文件,因为h文件就是so的一个符号列表索引,没有了这个h文件,从何谈起调用so中的函数。

二.so的动态加载

使用dlsym等函数在应用程序运行时加载so文件。由于dlsym等系列函数是C函数,所以针对C++的name mangling特性,封装的so中到处的C++类符号(比如类class Name),

必须定义两个纯C函数:

extern "C" Name* createName()
{
    return new Name();
}

extern "C" void deleteName(Name* n)
{
    delete n;
}

三.针对第一种使用情形,该如何设计发布用的h文件?

此时,h文件中#include 的其他文件应该要少。这个h文件中所有涉及new的操作都应该被封装起来,这是因为new操作需要涉及cpp中的实现,若使用了new,则这个h文件势必要#include 很多实现的文件。

四.针对第二种使用情形,要分清核心和插件

把核心定义为要动态加载so文件的程序,把插件定义为提供符号的so文件。插件使用核心的功能函数称为export,核心使用插件中的函数称为import。在动态加载so的项目程序中,核心要使用插件中功能的话,只能使用dlsym等系列函数,局限性比较大。然而,插件基本上可以使用核心的所有功能(这是建立在插件包含核心的h文件合理的基础上的,若都没有正确包含核心的h文件,编译都编不过)。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值