通过函数指针避免静态链接
来源:互联网 发布:这两天网络怎么了 编辑:程序博客网 时间:2024/06/06 03:35
如果动态链接库直接调用了静态库提供的函数,那么在生成动态库时需要静态链接被调用的函数。为了避免静态链接,可以调用函数指针而不是调用函数。原因在于:函数指针是一种变量,其值可以在运行时刻获得。
假设要编译生成testSo.So,testSo.so模块中需要调用A模块的函数func。
如果在testSo.so文件中直接调用A模块的func的函数,那么在编译生成testSo.so文件时肯需要静态链接库A模块。编写的代码如下:
//如下是testSo.so的源文件
int funInSo()
{
Int ret = func();//直接调用了A模块的func.
}
如果在testSo.so文件中使用的是函数指针而不是函数,那么则不需要静态链接A模块。代码例子为:
//如下是testSo.so的源文件
typedef int (*func)();
int funInSo()
{
//声明func类型的变量pFunc,并给变量pFunc赋值。
Int ret = pFunc();//使用了函数指针
}
使用函数指针避免静态链接的主要问题是:在动态库testSo中,如何正确的设置函数指针pFunc?
我给出如下一种参考方法:
第一, 动态链接库中的导出函数必须有如下的原型。
ReturnType functionName(FunctionTable*, …..);或者
ReturnType functionName(FunctionPointer*, ….);
“…”省略号表示其他参数。 上述例子中的pFunc或者是参数FunctionPointer的值,或者作为方法表FunctionTable的成员变量。
第二, 有且仅有一个模块装载动态链接库/直接调用动态链接库的导出函数。此库名称假设为porting。
第三, Porting库调用导出函数时,将方法表指针或者函数指针作为实参传递给导出函数。
使用上述方法编译的动态链接库不需要静态链接,但要仔细考虑porting库如何实现。
- 通过函数指针避免静态链接
- 通过指针访问类的静态成员函数
- 通过指针调用函数?
- 通过函数指针调用函数
- 通过函数指针调用函数
- 通过URL Rewrite实现链接静态化
- 通过指针引用虚函数
- 通过函数指针调用static
- 函数指针--成员函数(静态,非静态)&普通函数
- 在静态函数调用指针函数写法
- c++中的函数指针,静态函数法
- 笔记八:静态变量、静态成员函数、函数指针、静态函数指针
- 通过函数指针修改函数内容
- [C]通过函数指针得到函数名
- 静态链接库与动态链接库导出函数详解
- C++函数动态链接库及静态链接
- swift - 函数指针的应用 - 避免重复算法
- 通过线程来谈指针函数和函数指针
- 关于Context []startup failed due to previous errors有效解决方式
- Java内存泄漏分析
- Android: ListView添加animation后,在animation播放过程中背景变为黑色背景的解决方法
- Android源码下载
- 国外PHP程序员的13个好习惯
- 通过函数指针避免静态链接
- 用Qt中的QDomDocument类处理XML文件
- 面向对象软件设计原则(一) —— 引子(http://www.cnblogs.com/ldcsaa/archive/2012/02/12/2347082.html)
- 前端架构
- 请修改这段程序,立刻!
- 解析 XML 文件 - 跨浏览器实例
- oracle知识
- ORACLE 执行计划分析
- Android自动开关机实现