Python调用C/C++动态链接库(

 2024-03-16 00:07:39  阅读 0

由于实验需要发送固定字节大小的数据,不适合底层,所以使用c/c++作为底层来处理数据并记录整个过程。 需要注意的是,dll文件只是系统下的动态链接库。 它是Linux或Mac系统下的另一种文件类型。 本文仅使用编译生成系统下的动态链接库。

1.将C/C++函数封装成动态库(.dll)

首先给一下vs官网提供的教学文档(我参考的是官网,但是按照流程生成dll后,dll文件中并没有封装的函数,可能是我写错了某一步,大家可以按照教学尝试一下):

我的整个过程是这样的:

1.创建一个工程来编译dll文件。 这个在上面官网上有比较详细的介绍,这里不再赘述。 注意,在vs中新建一个工程,并为该工程选择动态链接库(DLL)。

2、将cpp文件添加到源文件中,编写函数。 比如我简单写了一个加法(add)函数:

#include "pch.h"      //导入该文件是编译提醒,不加会报错
#include   
#define MATHLIBRARY_API extern "C" __declspec(dllexport)   //主要就是加入这个宏定义
 MATHLIBRARY_API int add(int x, int y)   //在自己的函数前面加上定义的宏名,在编译成dll文件时就能将该函数加入动态链接库
{
	return x + y;
}

3.根据自己的系统和需求选择平台,然后生成解决方案。 我的是64位的,所以我选择x64。 如果不匹配,最后调用dll文件时会报错。

4、如果生成成功,会在工程的路径下生成一个x64文件夹,并且在debug文件夹下会有一个dll文件。 至此,动态链接库的生成就完成了。 接下来教大家如何检查dll文件中是否包含我们的函数。

打开

输入以下命令查看dll文件中有哪些函数

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

2.调用动态链接库(dll)

调用dll文件需要一个库。 该库不需要下载,它已经包含在内。 将生成的dll文件复制到工程中,且必须与调用该dll文件的文件在同一目录下。

import ctypes
from ctypes import *
mydll = CDLL("./demo.dll")    # 一定要有./ 否则无法调用成功
result = mydll.add(1, 2)      
print(result)

上述代码实现了对c/c++动态链接库中add函数的调用。 需要注意的是,c++中定义的add函数中传入的变量是int类型,不需要进行类型转换。 但如果定义add函数传入的变量是float类型,那么最后需要先将值转换为类型:

import ctypes
from ctypes import *
mydll = CDLL("./demo.dll")    # 一定要有./ 否则无法调用成功
result = mydll.add(ctypes.c_float(1.345), ctypes.c_float(2.232))
print(result)

因此,在调用dll动态链接库时,需要注意C/C++函数传入的变量的数据类型。 下面列出了 C/C++ 中对应的数据类型。 您可以根据自己函数的需要进行类型转换:

如果C/C++返回指针类型,那么在调用函数之前需要告知返回数据的类型。

import ctypes
from ctypes import *
mydll = CDLL("./demo.dll")    # 一定要有./ 否则无法调用成功
mydll.couculate.restype = POINTER(c_int)   #声明返回的数据类型为整数指针
result = mydll.add(ctypes.c_float(1.345), ctypes.c_float(2.232))
# 如果返回的数组指针,就在转化为list,[0:8]表示数组8个数据
# result = list(mydll.add(ctypes.c_float(1.345), ctypes.c_float(2.232))[0:8])
print(result)

目前为止就这样了。 我对数据类型的转换也很困惑。 我写的可能不太清楚,有错误或者遗漏。 我希望你能给我一些指导。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码