Python 调用 C 库的实现

在linux开发的动态链接库需要被python调用,首先需要生成.so文件。

生成动态链接库的方法网上有很多,这里就不用多说,主要就是首先根据源文件编译生成.o,然后链接这些.o文件-shared生成.so。需要注意的是,在编译链接生成动态库的时候一定要加-fPIC参数。而且如果在链接时需要链接其他库的话,必须保证其他库编译时也是加了-fPIC参数。这里笔者就是调用了mysql数据库libmysqlclient.a静态库,但是这个库没有加-fPIC编译,所以生成动态库的时候一直报错,说是需要加-fPIC重新编译。最后从网上下载了libmysqlclient的源码,然后加上-fPIC参数重新编译生成.a,问题才解决。

需要注意的是,libmysqlclient是使用cmake,该编译参数需要在CMakeList.txt文件里面修改编译参数加入-fPIC即可。

生成.so文件一定要将引用的其他库引用一起链接,如果不一起链接的话,在python调用的时候会报未定义错误。

生成动态链接库以后就可以在python里面调用了。

调用动态库可以使用ctypes和boost。

本次笔者使用ctypes调用.so动态库函数。

调用的方法:

1.在python中引入ctypes:

import ctypes

2.加载动态库

lib_handle = ctypes.CDLL('./xxx.so')

3.关联动态库中的函数

func = lib_handle.func

4.使用函数

func(par1,par2)

需要注意的是,在动态库中定义的全局变量不能在python中这样直接引用,目前引用的方法笔者还没有研究出来。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

Linux和Windows平台 动态库.so和.dll文件的生成

Linux动态库的生成1、纯cpp文件打包动态库将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令gccsharedfpic\.coxxx.so;gstdc17fpic\.cppoxxx.so;\C17标准,需要高版本gcc,本人采用gcc8.2.0\

Python 调用 C 库的实现 - HelloWorld