Python调用C/C++动态库

一、编译C++代码并封装成动态库

1、创建编译dll文件的项目,在上面的官网介绍的更详细,这里就不多做介绍了。注意在vs之中新建一个项目,项目选择动态链接库(DLL)

2、2.在源文件中添加cpp文件并写好函数

#include<iostream> 

#define MATHLIBRARY_API extern "C" __declspec(dllexport)   //主要就是加入这个宏定义

MATHLIBRARY_API int add(int x, int y)   //在自己的函数前面加上定义的宏名,在编译成dll文件时就能将该函数加入动态链接库
{
    return x + y;
}

class Test
{
public:
    int Add(int a, int b);
};

int Test::Add(int a, int b) {
    return a + b;
}

//调用类的情况
MATHLIBRARY_API int Add(int a, int b) {
    Test test;
    int sum = test.Add(a, b);

    return sum;
}


//不调用类
MATHLIBRARY_API int Sum(int a, int b){

    return a + b;
}

3、根据自己的系统及需要选择平台,然后生成解决方案即可。我的python是64位的,所以选择x64。若不匹配,在python端调用该dll文件就会报错。

4、如果生成成功,则在该项目的路径下会产生一个x64的文件夹,在该文件夹的debug里面就有dll文件,至此生成动态链接库就完成了。打开VS2019的 developer powershell输入下面命令就能查看到该dll文件内有哪些函数:

dumpbin /exports  绝对路径(C:\Users\source\repos\Mathlibrary\x64\Debug\Mathlibrary.dll)

二、Python调用动态链接dll

Python调用dll文件需要用到ctypes库,这个库并不需要下载,python3就已经自带了。将生成的dll文件复制到python项目下,一定要和调用dll文件的python文件在同一个目录下。

#!/usr/bin/python3
#!--*-- coding: utf-8 --*--
import ctypes

#加载动态链接库
lib = ctypes.cdll.LoadLibrary("F:\\Python_C\\x64\\Debug\\Python_C.dll")

lib.Add.argtypes = [ctypes.c_int, ctypes.c_int]     # 对C++库在python中的实例进行进一步的输入参数类型的定义
lib.Add.restype = ctypes.c_int                         # 对C++库在python中的实例进行进一步的输出类型的定义

lib.Sum.argtypes = [ctypes.c_int, ctypes.c_int]     
lib.Sum.restype = ctypes.c_int         

result0 = lib.add(1, 2)        #也可以不定义输出、输出参数类型,但输入类型要符合定义
result1 = lib.Add(3, 4)
result2 = lib.Sum(5, 6)
result3 = lib.add(ctypes.c_int(1.345), ctypes.c_int(2.232))    
print(result0, result1, result2)

所以利用ctypes调用dll动态链接库需要注意C/C++函数传入变量的数据类型。下面给大家列出了ctypes、C/C++、python对应的数据类型,大家按照自己函数的需要转换类型:

 

posted @ 2023-06-13 18:22  夏蝉沐雪  阅读(1895)  评论(0编辑  收藏  举报