Python调用C/C++之动态链接库(.dll)(vs2019+pycharm)

  由于实验需要发送固定字节大小的数据,且python不太适合做底层,故使用c/c++来作为底层处理数据,记录一下整个过程。须知dll文件仅仅是windows系统下动态链接库,linux或mac系统下是另一种类型的文件,本文也仅在windows系统下使用vs2019编译生成动态链接库。

一.将C/C++函数封装成动态库(.dll)

  先给出vs官网给出的教学文档(我参考了官网的,但是按照流程生成dll之后dll文件内并没有封装的函数,可能是我哪一步出错了,大家可以按照教学去试一试):
https://docs.microsoft.com/zh-cn/cpp/build/dlls-in-visual-cpp?view=msvc-170

  下面介绍我的整个流程:
  1.创建编译dll文件的项目,在上面的官网介绍的更详细,这里就不多做介绍了。注意在vs之中新建一个项目,项目选择动态链接库(DLL)
在这里插入图片描述
  2.在源文件中添加cpp文件并写好函数,例如我简单写了一个加法(add)函数:

#include "pch.h"      //导入该文件是编译提醒,不加会报错
#include<iostream>   

#define MATHLIBRARY_API extern "C" __declspec(dllexport)   //主要就是加入这个宏定义

 MATHLIBRARY_API int add(int x, int y)   //在自己的函数前面加上定义的宏名,在编译成dll文件时就能将该函数加入动态链接库
{
	return x + y;
}

  3.根据自己的系统及需要选择平台,然后生成解决方案即可。我的python是64位的,所以选择x64。若不匹配,在python端调用该dll文件就会报错。
在这里插入图片描述
  4.如果生成成功,则在该项目的路径下会产生一个x64的文件夹,在该文件夹的debug里面就有dll文件,至此生成动态链接库就完成了。下面再教大家如何查看该dll文件是否有我们的函数。
  打开VS2019的 developer powershell
在这里插入图片描述
  输入下面命令就能查看到该dll文件内有哪些函数

dumpbin /exports  绝对路径(C:\Users\source\repos\Mathlibrary\x64\Debug\Mathlibrary.dll)

在这里插入图片描述

二.Python调用动态链接库(dll)

  Python调用dll文件需要用到ctypes库,这个库并不需要下载,python3就已经自带了。将生成的dll文件复制到python项目下,一定要和调用dll文件的python文件在同一个目录下。

import ctypes
from ctypes import *

mydll = CDLL("./demo.dll")    # 一定要有./ 否则无法调用成功
result = mydll.add(1, 2)      
print(result)

  上面的代码就实现了调用c/c++动态链接库内的add函数,需要注意在c++中定义add函数传入的变量是int类型,在python之中就不需要转换类型。但是如果定义add函数传入的变量是float类型,那么python端就需要先将数值转换为c_float类型:

import ctypes
from ctypes import *

mydll = CDLL("./demo.dll")    # 一定要有./ 否则无法调用成功
result = mydll.add(ctypes.c_float(1.345), ctypes.c_float(2.232))
print(result)

  所以利用ctypes调用dll动态链接库需要注意C/C++函数传入变量的数据类型。下面给大家列出了ctypes、C/C++、python对应的数据类型,大家按照自己函数的需要转换类型:
在这里插入图片描述
  如果C/C++返回的是指针类型的呢,辣么就需要在调用函数前告知python返回的数据的类型

import ctypes
from ctypes import *

mydll = CDLL("./demo.dll")    # 一定要有./ 否则无法调用成功
mydll.couculate.restype = POINTER(c_int)   #声明返回的数据类型为整数指针
result = mydll.add(ctypes.c_float(1.345), ctypes.c_float(2.232))
# 如果返回的数组指针,就在转化为list,[0:8]表示数组8个数据
# result = list(mydll.add(ctypes.c_float(1.345), ctypes.c_float(2.232))[0:8])
print(result)

  暂时就这些了,我对数据类型的转换也很头大,写的也可能不太清楚、有错或者遗漏,希望大家指导。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值