Python调用C++动态库
1.要用到的C++动态库工程
ArrayTool.h
#ifndef ARRAY_TOOL_H
#define ARRAY_TOOL_H#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_API __declspec(dllexport) // 导出符号
#else
#define MYLIBRARY_API __declspec(dllimport) // 导入符号
#endif// 声明一个导出函数
extern "C" MYLIBRARY_API int MaxNum(int first_num, int second_num);#endif // !ARRAY_TOOL_H
ArrayTool.cpp
#define MYLIBRARY_EXPORTS // 为了让导出符号有效,所以才需要定义这个宏
#include "ArrayTool.h"// 返回 first_num 和 second_num 中的最大值
int MaxNum(int first_num, int second_num)
{return first_num > second_num ? first_num : second_num;
}
2.python工程目录
2.将所要用到的C++动态库放在python项目目录下,如下图:
PyCharm会自动加载C++动态库:
3.编写python代码:main.cpp
import ctypes, ctypes.util # ctypes 是 Python 的内置库,主要用于在 Python 中调用动态链接库# 查找动态库
def find_dll(dll_name):return ctypes.util.find_library(dll_name) # 查找DLL# 加载动态库
def load_dll(dll_path):try:vc_dll = ctypes.CDLL(dll_path) # 加载动态库,若失败抛出异常vc_func = vc_dll.MaxNum # 取动态库的函数max_num = vc_func(0,3) # 调用动态库函数print("max_num:"+str(max_num))except OSError as e:print(e, "加载DLL失败")# 主函数入口
if __name__ == "__main__":dll_path = find_dll("DLLDemo.dll")if dll_path:load_dll(dll_path)else:print("动态库路径不对")
4.执行python程序时会报错:[WinError 193] %1 不是有效的 Win32 应用程序。
原因如下图所示,因为此时我们用的动态库是32位的,但是python是64位的:
解决方法如下图所示,将动态库改成64位即可: