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

news2024/12/29 9:10:47

目录

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

前言:

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

配置环境:

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

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

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

1. 加载共享库

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

  • 对于 Linux/macOS:

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

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

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

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

2. 定义函数原型

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

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

int add(int a, int b);

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

import ctypes

# 加载库
lib = ctypes.CDLL("yourlibrary")

# 定义函数原型
lib.add.argtypes = [ctypes.c_int, ctypes.c_int]
lib.add.restype = ctypes.c_int

3. 调用函数

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

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

4. 处理数据结构

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

struct Point {
    int x;
    int y;
};

你可以在 Python 中这样定义:

import ctypes

class 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 同样支持指针操作。例如,要创建一个指向整数的指针:

import ctypes

int_pointer = ctypes.pointer(ctypes.c_int(5))
print(int_pointer.contents.value)  # 输出: 5

6. 错误处理

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

7. 使用 ctypes.util

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

import ctypes.util

lib_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配置有问题。

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

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.coloradmin.cn/o/2144733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LGR-200-Div.4】洛谷入门赛 #27 A - H题解,包含(C++, Go语言)

前言: 本文为【LGR-200-Div.4】洛谷入门赛 #27 A - H题解 我只是一个只会各种暴力法的蒟蒻,这场比赛没有参加,是比赛完去写的,但是那个题目昨天晚上才能提交,导致拖久了一点 最后面贴一个Go语言的,反正也没…

前端分段式渲染较长文章

实现思路: 1. 后端返回整篇文章。 2. JavaScript 分段处理:将文章按一定的字符或段落长度分割,然后逐步将这些段落追加到页面上。 3. 定时器或递归调用:使用 setInterval 或 setTimeout 来控制段落的逐步渲染。 代码实现示例 …

2024年企业必备10款源代码加密软件!保护公司源代码 !

随着科技的发展,企业的数据安全性变得愈发重要,特别是源代码——企业的核心资产之一。源代码一旦泄露,可能带来不可估量的损失,导致竞争优势丧失、知识产权泄露,甚至对企业的未来生存造成威胁。因此,确保源…

Centos中关闭swap分区,关闭内存交换

概述: Swap 分区是 Linux 系统中扩展物理内存的一种机制。Swap的主要功能是当全部的RAM被占用并需要更多内存时,用磁盘空间代理RAM内存。Swap对虚拟化技术资源损耗非常大,一般虚拟化是不允许开启交换空间的,如果不关闭Swap&…

城市脉络下的空间句法:整合度与选择度的深度解析

上回写过一篇,基于空间句法的路网整合度、选择度分析,当时碍于篇幅和侧重点,主要讲了如何安装sDNA这个插件来实现路网的整合度、选择度分析,并且分析部分也只是画了几条简单的线段,这次我们深化一下原理和指标的解析&a…

手势识别-Yolov5模型-自制数据集训练

1、源码下载: 大家可以直接在浏览器搜索yolov5即可找到官方链接,跳转进github进行下载: 这里对yolov5模型补充说明一下,它是存在较多版本的,具体信息可在master->tags中查看,大家根据需要下载。这些不同…

2024.9.18 作业

将配置桥接网络的过程整理成文档,发csdn 放资源里了 思维导图:

0基础带你入门Linux之简介

1.Linux和Windows对比 Window很明显的特征就是有C盘、D盘登各种磁盘 我们通过点击不同的盘符,点击里面存储的文件进行查阅的操作 而Linux则很简单,只有一个根目录,也可以说只有一个盘,整个系统所有的东西都是在根目录下的 我们可…

C/C++中哪些数据存放于栈区、堆区、静态区、常量区的详细说明

文章目录 1. 栈区(Stack)2. 堆区(Heap)3. 静态区(Static)4. 常量区(Read-Only or Constant Section)总结:栈(Stack)的生长:堆&#xf…

js中apply,call,bind的区别与用法

在JavaScript中,所有的函数再被调用的时候都会默认传入两个参数,一个是this,还有一个是arguments。在默认情况下this都是指当前的调用函数的对象。但是有时候我们需要改变this的指向,也就是说使函数可以被其他对象来调用&#xff…

【数据可视化】Arcgis api 4.x 专题图制作之分级色彩,采用自然间断法(使用simple-statistics JS数学统计库生成自然间断点)

1.效果 2.实现 2.1 分级色彩 分级色彩是在GIS制图中,通过不同颜色等级来表示数据量级差异的符号化方法,帮助用户直观识别和比较数据的大小。 2.2 分级方法 在GIS中进行分级色彩制图时,可以选择不同的分级方法来表示数据的分布和变化&#xf…

好用又便宜的电商分账系统

多部门联合治税的背景下,合规运营是企业的首要任务。确保税务合规不仅能避免法律风险,还能提升企业的信誉和运营效率,电商分账系统是电商行业必备的合规工具。今天,商淘云为您分享选择性价比高的电商分账系统的三大规则&#xff0…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录,我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可,如果存在的情况我们再去获取下用户的信息看看token是否过期…

探索音乐的新边界——AI写歌的奇妙呈现

在音乐的世界里, 创新总是令人充满期待。 对于没有创作灵感、毫无创作水平的小孩,走进一个充满惊喜的音乐平台 —— (Suno) 看看AI 写歌的神奇魅力。S为我们提供了一个丰富多彩的音乐世界, 从新歌推荐到各种风格的音…

Vmware虚拟机无法打开内核设备“\\.\Global\vmx86“的解决方法

我的问题是在一次系统更新后,导致虚拟机无法使用的。我的虚拟机只有方法三解决了问题。 一、方法一 以管理员身份打开cmd,依次执行以下命令: net start vmci net start vmx86 net start VMnetuserif二、方法二 按 WinR 键,运行…

用好这几个AI抠图工具,既省心又省力!

在设计、摄影和数字创作的世界里,抠图虽然常见,却往往让人感到繁琐。不过,随着人工智能的飞速发展,许多可爱的AI抠图工具应运而生,轻松高效地解决了这一难题!下面就来看看几款超级实用的AI抠图工具&#xf…

Python “字符串操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

本文主要是作为Python中列表的一些题目,方便学习完Python的元组之后进行一些知识检验,感兴趣的小伙伴可以试一试,含选择题、判断题、实战题、填空题,答案在第五章。 在做题之前可以先学习或者温习一下Python的列表,推荐…

Qt 学习第九天:标准对话框 页面布局

系统标准对话框 错误对话框 //错误对话框connect(createPro, &QAction::triggered, this, []{//参数1 父亲 参数2 标题 参数3 对话框内显示文本内容 。。。QMessageBox::critical(this, "报错!", "没加头文件!");}); 【运行结果】 信息对话框 co…

使用arduino玩基于esp8266的nodemcu开发板

一、简介 中秋节到图书馆看书,看到了arduino方面的书籍,里面有提到ESP8266模块。让我想起我抽屉里吃灰很久了的基于esp8266的nodemcu开发板。于是把书借回家研究了一下。这里做个记录。 二、我目前在使用的云服务器推荐 学Linux不搞个云服务器始终感觉…