python引用C++ DLL文件若干解释及示例

首先说一下,python不支持C++的DLL,但是支持C的DLL;C++因为和C兼容可以编译为C的DLL,这是下面文章的背景与前提


首先我这儿的示例使用VS2017编译的DLL,先讲过程,再解释

第一步,新建DLL项目

c vs2008 执行python python 调用c++ dll_python

确定之后我们可以看到默认的文件

c vs2008 执行python python 调用c++ dll_头文件_02

这时候我们需要新建一个与Test.cpp对应的头文件

c vs2008 执行python python 调用c++ dll_python_03

这是完成之后的代码结构

c vs2008 执行python python 调用c++ dll_Test_04

下面是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的部分,主要参考了这篇博文,感谢”无尽的数字眩晕症“