参考链接https://www.cnblogs.com/TQCAI/p/8881530.html
https://www.jb51.net/article/52513.htm
https://www.cnblogs.com/pyse/p/8590829.html
windows安装MinGW-w64教程https://www.cnblogs.com/ggg-327931457/p/9694516.html
公司业务需要,让我用python调用领导写好的dll库,经过一段时间的研究,终于调用成功,特此来记录一下过程
开发环境win10+python3.6.8(64位)
1.安装MinGW-w64
安装这个的目的是生成dll文件用,参考地址在上面,讲一下注意的点。
- 安装的时候version选择最新的即可。
- 安装目录随便选,不是C盘也可以.
- 在这一步下载的时候,大概是20分钟左右,如果觉得慢的话,可以直接去下载源码然后解压即可,参考文章里的八、问题列表里有说明
- 安装好记得在命令行里面验证一下是否正确安装
2.编写文件生成dll
#include <stdio.h> extern "C" { __declspec(dllexport) int Double(int x); __declspec(dllexport) float floatAdd(float a,float b); __declspec(dllexport) void HelloWorld(char * str); __declspec(dllexport) void Ints(int * arr,int n); } int Double(int x){ return x*2; } float floatAdd(float a,float b) { return a+b; } void HelloWorld(char * str){ puts(str); } void Ints(int * arr,int n){ for(int i=0;i<n;i++){ printf("%d ",arr[i]); } puts(""); }
生成dll
g++ dlltest.cpp -shared -o dlltest.dll
3.python调用dll
from ctypes import * dll = windll.LoadLibrary('E:codelx_codedlltest.dll') print(dll) a=dll.Double(123) print(type(a)) print(a)
输出内容
<WinDLL 'E:codelx_codedlltest.dll', handle 6c100000 at 0x27f2ab8bc88> <class 'int'> 246
到这里,就算调用成功了。
4.可能会遇到的问题
ctypes库加载dll有好几种方式,你可以自己尝试一下用哪一种方式,参考网址https://www.cnblogs.com/baihuitestsoftware/articles/5345089.html
stdcall调用约定:两种加载方式
Objdll = ctypes.windll.LoadLibrary("dllpath") Objdll = ctypes.WinDLL("dllpath")
cdecl调用约定:也有两种加载方式
Objdll = ctypes.cdll.LoadLibrary("dllpath") Objdll = ctypes.CDLL("dllpath") # 其实windll和cdll分别是WinDLL类和CDll类的对象。