一、问题及解决描述:
当使用c++生成的dll给python使用,python使用ctypes调用dll时出现不是有效的win32应用程序
原因:python的编译环境有32位和64位,而c++编译的dll动态链接库也是有32位和64位平台之分
解决方法:如果dll链接库是别人提供的,那么只能创建新的虚拟环境,安装python解析器与dll支持的平台环境一致(此方法此处不解释),如果dll是自己编译的,那么只需要更改编译生成的支持平台即可(使用vs2012编译)
二、使用vs2012生成dll
此处引用:https://blog.csdn.net/kylett/article/details/84290853的博客
1.源文件中创建cpp文件
#define DLLEXPORT extern "C" __declspec(dllexport)
#include "stdio.h"
DLLEXPORT wchar_t* sum(wchar_t *str, int b, float f) {
static wchar_t a[] = L"你好,world";
static wchar_t szBuffer[100];
float x = b + f;
swprintf(szBuffer, 255,L"%s,%s,%f", a, str, x);
return szBuffer;
}
2.编译生成dll文件
编译前需要配置新的管理器(默认是win32平台)->选择配置管理器
点击新建:
选择x64->确定后编译当前的代码即可:
三、创建python代码,调用dll文件
1.如果使用的是win32编译成的dll文件,在使用python(63位)调用时,将出现以下报错信息:
2.如何确定python支持的平台:
3.代码如下:
import platform
platform.architecture()
确定没有问题后,开始调用dll文件进行测试:
from ctypes import *
dll = CDLL('Dll_To_Python.dll')
dll.sum.argtypes = [c_wchar_p,c_int,c_float]
dll.sum.restype = c_wchar_p
str = "come in";
pchar = dll.sum(str,2,3.215)
print(pchar)
此处依旧引用:https://blog.csdn.net/kylett/article/details/84290853的博客
四、总结
1.知道dll支持的平台
2.知道python解析器支持的平台
3.编写dll文件
4.引用dll文件
五、扩展
如何将OpenCV的功能和自己写的算法使用c++封装好成dll动态链接库文件给python使用?