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文件,编译都编不过)。