python调用c语言动态库_Python 和 C 语言中调用.so动态库

本文详细介绍了如何在C语言和Python中创建及调用动态库(.so文件)。通过实例展示了如何编写C源代码,使用g++编译生成.so文件,并在Python中使用ctypes库加载和调用该库。同时,文章还讲解了C语言中使用dlopen、dlsym等API动态链接库的方法,展示了如何在C程序中调用.so文件中的函数。
摘要由CSDN通过智能技术生成

什么是静态库和动态库, 看一篇博客

http://www.cnblogs.com/skynet/p/3372855.html

现在,我们首先生成.so文件

首先, 我们写一个a.c文件

#include

void show() {

printf("this is a test\n");

}

int add(int a, int b) {

return a + b;

}

然后输入命令

gcc a.c -fPIC -shared -o a.so

在当前目录下会产生一个a.so文件

其中 -fPIC是position independent code(位置无关代码)的意思

-shared是产生一个可以与其他对象连接来形成一个可执行文件的共享对象的一个参数

首先, python中调用.so库

from ctypes import cdll

cur = cdll.LoadLibrary('./a.so')

cur.show()

print cur.add(1, 2)

结果如下

hello, world!

3

然后,在C语言中调用.so文件

首先看一组API

#include

void *dlopen(const char *filename, int flag);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

char *dlerror(void);

下面, 分别解释这几个函数

dlopen

dlopen()函数以指定模式打开指定的动态链接库文件,并返回动态链接库的句柄。参数flag有以下两种常用的值,并且必须指定其一。 RTLD_LAZY:在dlopen返回前,对于动态库中存在的未定义的变量(如外部变量extern,也可以是函数)不执行解析,就是不解析这个变量的地址。 RTLD_NOW:与上面不同,他需要在dlopen返回前,解析出每个未定义变量的地址,如果解析不出来,在dlopen会返回NULL.

dlsym

dlsym()函数根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。参数的含义如下: handle:由dlopen打开动态链接库后返回的指针; symbol:要求获取的函数或全局变量的名称。

dlclose

dlclose()函数用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

dlerror

当动态链接库操作函数,如dlopen/dlsym/dlclose//执行失败时,dlerror()函数可以返回最近的出错信息,返回值为NULL时表示操作函数执行成功。

C语言用户需要包含头文件dlfcn.h才能使用上述API。

然后, 我们新建一个main.c文件

/**

#include

void *dlopen(const char *filename, int flag);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

char *dlerror(void);

**/

#include

#include

#include

int main() {

void *foo = dlopen("./a.so", RTLD_LAZY);

dlerror();

void (*fun)() = dlsym(foo, "show");

int (*fun1)(int, int) = dlsym(foo, "add");

fun();

printf("%d\n", fun1(1, 2));

dlclose(foo);

return 0;

}

然后编译命令

gcc main.c -ldl

输出结果:

hello, world!

3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值