python调用c++动态链接库,环境是VS2022和vscode2023

embedded/2024/9/25 0:57:30/

目录

  • 前言:
  • 配置环境:
  • 基础夯实(对于ctypes的介绍):
      • 1. 加载共享库
      • 2. 定义函数原型
      • 3. 调用函数
      • 4. 处理数据结构
      • 5. 处理指针
      • 6. 错误处理
      • 7. 使用 `ctypes.util`
      • 总结
  • 效果展示:
  • 操作步骤(保姆级教学)
    • 一在VS中创建dll文件:
      • 首先打开vs
      • 创建新项目
      • 选择c++的空项目
      • 配置新项目
      • 选择新建项
    • 二在VScode中使用python调用dll文件:
      • vscode创建python文件
      • 导入代码:
      • 从终端查看结果
  • 参考资料:

前言:

最近和一位前辈聊天,说到使用python来调用c++动态链接库来解决问题,可以增加产品的性能,所以尝试学习这个技术,后面还会尝试使用c++来调用python函数,实现不同语言的交叉使用。欢迎大家交流学习。c++来调用python函数已出c++调用python函数进行传参计算和返回

配置环境:

在VS中生成c++动态连接库,也就是dll,在vscode中使用python语言进行调用:
在这里插入图片描述
在这里插入图片描述

基础夯实(对于ctypes的介绍):

ctypes 是 Python 的一个外部库,用于调用存储在共享库(如 C 或 C++ 库)中的函数,以及处理 C 数据结构。它提供了一种简单的方式来从 Python 代码中访问 C 代码的功能。下面是一些基本的 ctypes 用法示例:

1. 加载共享库

首先,你需要加载一个共享库(例如 .dll.so.dylib 文件)。ctypes 提供了 CDLLWinDLL 来加载不同平台的库。

  • 对于 Linux/macOS:

    python">import ctypes
    lib = ctypes.CDLL("/path/to/your/library.so")
    
  • 对于 Windows:

    python">import ctypes
    lib = ctypes.WinDLL("/path/to/your/library.dll")
    

或者,如果库位于系统的标准库路径中,你可以直接加载库名:

python">import ctypes
lib = ctypes.CDLL("yourlibrary")

2. 定义函数原型

加载库之后,你需要为将要调用的函数定义原型。这包括函数的返回类型和参数类型。

例如,如果你的 C 库中有一个函数如下:

int add(int a, int b);

你可以在 Python 中这样定义它:

python">import ctypes# 加载库
lib = ctypes.CDLL("yourlibrary")# 定义函数原型
lib.add.argtypes = [ctypes.c_int, ctypes.c_int]
lib.add.restype = ctypes.c_int

3. 调用函数

定义了函数原型之后,你就可以从 Python 中调用这个函数了:

python">result = lib.add(2, 3)
print(result)  # 输出: 5

4. 处理数据结构

ctypes 也支持定义和使用 C 风格的数据结构。例如,对于下面的 C 结构体:

struct Point {int x;int y;
};

你可以在 Python 中这样定义:

python">import ctypesclass Point(ctypes.Structure):_fields_ = [("x", ctypes.c_int),("y", ctypes.c_int)]# 创建实例
point = Point(x=10, y=20)
print(point.x, point.y)  # 输出: 10 20

5. 处理指针

ctypes 同样支持指针操作。例如,要创建一个指向整数的指针:

python">import ctypesint_pointer = ctypes.pointer(ctypes.c_int(5))
print(int_pointer.contents.value)  # 输出: 5

6. 错误处理

当调用外部函数时,可能会遇到各种错误。ctypes 允许你检查错误码或者捕获异常来处理这些情况。例如,对于 C 库函数返回的错误码,你可以根据需要进行处理。

7. 使用 ctypes.util

ctypes.util 提供了一些实用工具,如 find_library 函数,它可以帮助你查找系统中安装的库:

python">import ctypes.utillib_name = ctypes.util.find_library("yourlibraryname")
if lib_name:lib = ctypes.CDLL(lib_name)
else:raise ImportError("Library not found")

总结

ctypes 是一个功能强大的工具,它允许你在 Python 中使用 C 代码。通过定义函数原型、处理数据结构和指针,以及进行错误处理,你可以将 Python 的易用性和 C 的性能结合起来。不过,对于复杂的 C++ 代码,ctypes 可能不够直观,此时你可能需要考虑使用 cffiSWIG 或其他工具。

效果展示:

在这里插入图片描述

操作步骤(保姆级教学)

一在VS中创建dll文件:

首先打开vs

在这里插入图片描述

创建新项目

在这里插入图片描述

选择c++的空项目

注意类型不要选错了
在这里插入图片描述

配置新项目

在这里插入图片描述

选择新建项

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码:

#include "pch.h"
#define DLLEXPORT extern "C" __declspec(dllexport) 
//两数相加
DLLEXPORT int sum(int a, int b) {return a + b;
}

如果没有生成成功,看一下是不是dll配置有问题。

pythondll_161">二在VScode中使用python调用dll文件:

python_162">vscode创建python文件

这个配置文件没什么好说的,直接创建一个文件夹,然后使用vscode打开,创建一个以py结尾的文件即可:
在这里插入图片描述

导入代码:

from ctypes import *
//参考我的路径写法pDll = CDLL("C:\\Users\\wangningning\\source\\repos\\Dll3\\x64\\Debug\\Dll3.dll")
pDll = CDLL("你的dll路径")#调用动态链接库函数
res = pDll.sum(15,20)
#打印返回结果
print(res)

从终端查看结果

在这里插入图片描述
如果结果一样,恭喜你,成功使用python调用了c++动态链接库。

参考资料:

参考资料


http://www.ppmy.cn/embedded/116365.html

相关文章

面试金典题2.2

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 输入: 1->2->3->4->5 和 k 2 输出: 4 本题的思路其实很简单,总共n个数,找倒数第k个数,其实就是找第n-k个数。主要的问题是这…

Node-RED和物联网分析:实时数据处理和可视化平台

这篇论文的标题是《Node-RED and IoT Analytics: A Real-Time Data Processing and Visualization Platform》,发表在《Tech-Sphere Journal of Pure and Applied Sciences (TSJPAS)》2024年第一期上。论文主要探讨了Node-RED和物联网分析在物联网(IoT)实时数据处理…

SpringSecurity6.x整合手机短信登录授权

前言:如果没有看过我的这篇文章的Springboot3.x.x使用SpringSecurity6(一文包搞定)_springboot3整合springsecurity6-CSDN博客需要看下,大部分多是基于这篇文章的基础上实现的。 明确点我们的业务流程: 需要有一个发送短信的接口&#xff0…

解决uniapp开发的app,手机预览,上下滑动页面,页面出现拉伸,抖动的效果问题,

在pages.json文件里“globalStyle”下面的"app-plus"里加入"bounce": "none"即可 "app-plus": { "bounce": "none", //关闭窗口回弹效果 }

什么是后端开发 ?

后端,亦称“服务器端开发”。同样,在后端服务器和浏览器或应用程序之间存储网站、应用数据和中间媒介的服务器都属于后端。也可以这么说,在应用程序或网站的屏幕上看不到的所有东西都是前端的后端。那么后端开发的基本流程是什么呢&#xff1…

mysql学习教程,从入门到精通,SQL 更新数据(UPDATE 语句)(17)

1、SQL 更新数据(UPDATE 语句) SQL UPDATE 需要指定要更新的表、要修改的列以及新值,并且通常会通过WHERE子句来指定哪些行需要被更新。下面是一个简单的示例,说明如何使用UPDATE语句。 假设我们有一个名为employees的表&#xf…

开关磁阻电机(SRM)系统的matlab性能仿真与分析

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 SRM的基本结构 4.2 SRM的电磁关系 4.3 SRM的输出力矩 5.完整工程文件 1.课题概述 开关磁阻电机(SRM)系统的matlab性能仿真与分析,对比平均转矩vs相电流,转矩脉动vs相电流&a…

Linux_openEuler_24.03部署Oracle 19c部署安装实测验证(无图形桌面-RPM模式)

前言: 近期对openeuler有点兴趣,顺带在做个开发数据仓项目,那就正好安装个环境做个调测,做个记录放上来做个备录给到大家参考。 openEuler 24.03 LTS:四大升级, 首个AI原生开源操作系统正式发布 openEuler …