python引用C++ DLL文件若干解释及示例
python引用C++ DLL文件若干解释及示例
首先说一下,python不支持C++的DLL,但是支持C的DLL;C++因为和C兼容可以编译为C的DLL,这是下面文章的背景与前提
首先我这儿的示例使用VS2017编译的DLL,先讲过程,再解释
第一步,新建DLL项目
确定之后我们可以看到默认的文件
这时候我们需要新建一个与Test.cpp对应的头文件
这是完成之后的代码结构
下面是Test.h文件的内容和Test.cpp文件的内容及相应解释
// Test.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "Test.h"
bool Test1()
{
return true;
}
bool Test2()
{
return false;
}
首先我们需要引用Test.h,也就是我们刚刚建立的与之匹配的头文件
Test1和Test2就是我们写的python需要调用的函数,因为python在调用DLL时除了int型其他的返回类型都需要指定,所以我用bool来展示
//Test.h
#pragma once
extern "C" __declspec(dllexport) bool Test1();
extern "C" __declspec(dllexport) bool Test2();
这是我们建立的头文件
第一行VS自动生成,不用管它,它的作用是保证头文件只被编译一次
第二行和第三行就是我们要添加的代码,这两行就是我们定义的函数,有点像以前学C语言的时候老师说的定义在main函数后面的函数要在前面先写一次,记住这个形式就好了。我来讲讲前面的代表什么意思
- extern “C”
这个的意思是声明的函数可以被其他模块调用,并且编译为C文件
- __declspec(dllexport)
这是MS VC中专用的关键字,表示将函数、类等声明为导出函数,供其他程序调用
这两个加起来添加到头文件里,声明的函数编译出来就可以被python调用了
python调用方法也很简单
from ctypes import *
dll = CDLL("Test.dll")
dll.Test1.restype = c_bool
# restype是函数的返回类型,c_bool代表返回bool类型,这里的对应关系就自己查一下了
# 除了restype还有argtypes,代表函数的参数类型
print(dll.Test1())
整体大致就是这样了,如果没成功可以给我留言看看,我也是个新手,最近因为一个项目才用到Python,如果有什么不对的请批评指正
关于ctypes的部分,主要参考了这篇博文,感谢”无尽的数字眩晕症“