1、介绍
Python作为一个开发效率高的脚本语言,在开发商比较有效率。而底层库大都是C++编写的,效率高。因此开发的时候遇到对效率要求高的时候采用C++编写库。这就需要封装一个接口给Python脚本去调用。
2、代码
直接上代码吧。编译器用的是VS2017
image.png
选择DLL文件,确定之后删掉预编译头那些东西。选择环境为x64。
image.png
image.png
image.png
环境要选对,因为64位的Python调用不了x86环境编写的DLL(32位)。
DllTest.h
#pragma once
#include <iostream>
class DllTest {
double a;
double b;
public:
void SetParam(double _a, double _b);
void DisplayParam();
int AddParam();
};
DllTest.cpp
#include "DllTest.h"
void DllTest::SetParam(double _a, double _b)
{
a = _a;
b = _b;
}
void DllTest::DisplayParam()
{
std::cout << "a = " << a << ", b = " << b << std::endl;
}
int DllTest::AddParam()
{
return static_cast<int>(a + b);
}
dllmain.cpp
#include "DllTest.h"
extern "C" {
DllTest d;
__declspec(dllexport) void Set(double _a, double _b)
{
d.SetParam(_a, _b);
}
__declspec(dllexport) void Print()
{
d.DisplayParam();
}
__declspec(dllexport) int Add()
{
return d.AddParam();
}
}
直接生成,在目标路径下就会生成一个Dll1.dll文件,将这个文件复制到Python脚本的目录下。
image.png
image.png
Python代码如下:
test.py
import ctypes
# 加载动态链接库
cpp = ctypes.cdll.LoadLibrary("Dll1.dll")
# 设置Set函数的形参类型
cpp.Set.argtypes = [ctypes.c_double, ctypes.c_double]
# 设置Add函数的返回值类型
cpp.Add.restype = ctypes.c_int
# 调用Set,Print和Add函数
cpp.Set(1.0, 2.0)
cpp.Print()
print(cpp.Add())
输出结果为:
image.png
这样便可以成功调用C++编写的动态链接库了。
结语
闲暇记录一下代码,方便自己回看,如果能帮到你就更好了。