栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

(python)利用python调用lib静态库--基于vs2019打包dll动态库

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(python)利用python调用lib静态库--基于vs2019打包dll动态库

小白又来摸石头过河,详细记录一下这几天的写bug历程,作为一篇学习笔记。近期需要用python对厂家提供的lib静态库进行调用,众所周知,python对c/c++ 的函数库调用很方便,导入ctypes模块,处理好对应的数据类型,就可以方便实现对.so、.dll动态库的调用。但是ctypes只能动态调用,所以不支持对lib静态库的调用。
我们考虑利用vs2019将lib静态库打包成一个dll类型的动态库,再利用ctypes模块来调用,方案思路来源于其他文章。下边的过程利用了一个自定义的静态库来验证此方案。

一、建立自定义的lib静态库文件

首先我们打开vs2019,选择新建空项目或直接建静态库项目:
建立了空项目的,需要手打把项目的属性里配置类型改为静态库(.lib),注意修改属性时,平台选择的是在x64模式下,且注意在新建项目时也要把主界面上边的选成x64模式,因为python一般是64字节的,所以我们整个过程产生的文件和调试环境也设置成64字节模式下的。

新建头文件和c++文件,对应的代码如下,编写完成后,点击调试或生成解决方案:

于是我们可以在相对路径 .x64Debug 下找到生成的.lib文件:

二、在c++中调用生成的.lib静态库

在vs2019中新建一个空项目,把模式调整到x64的模式,在项目的相对路径下新建一个文件夹,用来存放我们自定义lib库的资料:

在其下一级目录,分别再新建一个lib文件夹和include文件夹,将第一步中的头文件和生成的lib文件,分别放入include文件夹和lib文件夹。


新建c++文件,输入一下代码:

#include
#include
#include
using namespace std;

int sum(int a, int b, int c)
{
	//调用自定义lib库中的函数
	return add(a, b)+c;
}

int main()
{
	
	cout << sum(1, 2, 3) << endl;
	system("pause");
	return 1;
}

在引入的自定义头文件处会报错,且识别不到add()函数,我们需要在项目的属性中配置一下:



运行结果:

三、生成lib文件

在成功调用静态库的基础上,我们将此项目转换为生成lib的项目,先将第二步中的项目属性按照下图来设置。

在原来项目的基础上,我们新建一个头文件,作为我们.dll动态库的头文件,且在原c++的文件中包含进新建的头文件,头文件的代码如下:

#ifndef __LIBTODLL_H
#define __LIBTODLL_H

//声明此文件的编译以c文件的形式进行
extern "C"
{
	//dll 中函数导出的前缀
	__declspec(dllexport) int sum(int a, int b,int c);
}
#endif


除了调用了lib静态库的sum()函数声明外,我们需要加上一些必要的导出前缀,并且以c语言的方式导出,完成后,点击调试或生成解决方案。

在对应的相对路径下,会生成这几个文件,其中.exe是第二步运行程序产生的,其他四个文件是生成 .dll 动态库时候同时产生的。这里产生的.lib文件不同于静态库产生的.lib文件,不可直接使用,如果没有生成 .lib 文件可能是在函数前没有加上 __declspec(dllexport) 前缀。

四、调用包含.lib文件的.dll文件

利用vscode软件在,新建一个 .py 文件,将第三步生成的.dll文件放到同一个目录下,在python文件中,输入以下代码:

from ctypes import cdll

def main():
    lib = cdll.LoadLibrary('./ProductLibToDll.dll')
    print(lib.sum(18,4,66))

if __name__ == "__main__":
    main()

大功告成,若运行失败的话仔细对比一下前边的步骤,是不是在x64模式下,是不是没有编译成c语言或加生成dll文件的必要前缀,或者可以考虑在release模式式生成.lib 或 .dll 文件。

可以利用软件dependency Walker 查看生成的 .dll 文件的生成函数,直接将需要查询的 .dll 文件拖入,忽略此类警告:

Dependency Walker的官方下载链接

本人小白,很多解决方法和学习资料也来源于网络,若有不正确或疏忽的地方,请及时指正,溜了溜了~

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037586.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号