Win11下python 调用C++动态链接库dll

这里写自定义目录标题

  • Win11下python 调用C++动态链接库dll
  • 环境
  • 修改C语言代码
  • Visual Studio 2019生成dll
  • Python 加载DLL
  • python 数据类型适配
  • python调用函数

Win11下python 调用C++动态链接库dll

在一些耗时的函数上考虑使用C++进行加速,涉及把cpp文件转为dll,供python来调用

环境

Python 3.11.10 64 bit

Windows11

修改C语言代码

由于代码中包含C语言,需要用到extern "C"关键字,指示编译器这部分代码按 C 语言的进行编译,而不是 C++。

将C语言函数包含到以下大括号中:

extern "C"
{
}

其次,在DLL在调用的函数前添加 __ declspec(dllexport),如下:

__declspec(dllexport) DetectionResult* detection(const char* file_name)
{	
}

在C++编程中,__declspec(dllexport) 用于将函数、数据、类或类成员函数从动态链接库(DLL)中导出,使得其他程序或模块能够调用和使用这些导出的函数或数据。

Visual Studio 2019生成dll

如下图所示,首先在项目上右击点击属性,配置选择Release, 平台选择x64,配置类型选择动态库dll

在这里插入图片描述

在x64->Release下找到demo.dll,并复制到python文件下

大部分教程采用g++编译,如下命令,但python调用会存在加载失败问题

g++ -shared -o demo.dll demo.cpp

Python 加载DLL

    try:lib = ctypes.WinDLL("./demo.dll")print("DLL loaded successfully!")except FileNotFoundError as e:print("Error loading DLL:", e)

python 数据类型适配

数据类型对应表
在这里插入图片描述
使用ctypes包

import ctypes

例如,C++语言代码中输出的是一个结构体

struct DetectionResult {double* candidates; // int imgx; // 图像宽度int imgy; // 图像高度unsigned char* out; // double* vec_out;  // 
};

Python文件中将对应的类型进行修改

class DetectionResult(ctypes.Structure):_fields_ = [("candidates", ctypes.POINTER(ctypes.c_double)),("imgx", ctypes.c_int),("imgy", ctypes.c_int),("out", ctypes.POINTER(ctypes.c_ubyte)),  ("vec_out", ctypes.POINTER(ctypes.c_double)),]
# 设置返回类型lib.detection.argtypes = [ctypes.c_char_p]lib.detection.restype = ctypes.POINTER(DetectionResult)

python调用函数

    # 调用函数result = lib.detection( file_name.encode('utf-8') )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/892788.shtml

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

相关文章

探索 Transformer²:大语言模型自适应的新突破

目录 一、来源: 论文链接:https://arxiv.org/pdf/2501.06252 代码链接:SakanaAI/self-adaptive-llms 论文发布时间:2025年1月14日 二、论文概述: 图1 Transformer 概述 图2 训练及推理方法概述 图3 基于提示的…

CSRF(跨站请求伪造)深度解析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

七十五:握手的优化:Session缓存、Ticket票据及TLS 1.3的0-RTT

引言 在现代互联网环境中,安全性和性能是设计网络协议时至关重要的两个方面。传输层安全性(TLS)协议是实现安全传输的关键机制。然而,传统的TLS握手过程虽然安全,但是存在潜在的延迟问题。为了优化握手的效率&#xf…

5、docker-compose和docker-harbor

安装部署docker-compose 自动编排工具,可以根据dockerfile自动化的部署docker容器。是yaml文件格式,注意缩进。 1、安装docker-compose 2、配置compose配置文件docker-compose.yml 3、运行docker-compose.yml -f:指定文件,up&…

QNAP 上常用的几款软件

当我们谈到 NAS(Network Attached Storage)时,QNAP 凭借多年的产品迭代、稳定的硬件性能和不断丰富的软件生态,已成为很多家庭及中小型企业的首选。除了存储本身,QNAP 提供的各种官方软件和应用,也为用户带…

Jmeter进行http接口并发测试

目录: 1、Jmeter设置(1)设置请求并发数(2)设置请求地址以及参数(3)添加结果数 2、启动看结果 1、Jmeter设置 (1)设置请求并发数 (2)设置请求地址…

PHP与HTML、CSS、JavaScript、jQuery的关系**

在当今数字化的Web开发领域,PHP与HTML、CSS、JavaScript、jQuery各自扮演着重要的角色,并且它们之间存在着紧密而复杂的关系。 一、HTML与PHP的关系 HTML(超文本标记语言)是构建网页内容结构的基础。它定义了网页中的各种元素&a…

[笔记] VS Code 完全指南:快捷键速查手册 与 Vue 开发插件推荐

文章目录 一. Vue 开发插件推荐二. 快捷键速查手册1. 基础操作2. 基础编辑 Basic editing3. 导航 Navigation4. 搜索和替换 Search and replace5. 多光标和选择 Multi-cursor and selection6. 丰富的语言编辑 Rich languages editing7. 编辑器管理 Editor management8. 文件管理…

永久免费不限速下载器支持市面上大部分BT链接

该款鲨鱼下载器目前是市面上免费下载,且不限速的下载器个别的链接无法识别 官方QQ群857577200 下载链接 官网

混币器是什么,波卡跨链交易平台

混币器是什么 混币器是一种加密货币工具,主要功能是将用户的加密货币与其他众多用户的加密货币混合在一起,打乱资金的流向和交易痕迹,使得加密货币的来源和去向难以追踪,从而增加交易的匿名性和隐私性。以下是对其工作流程和相关举例的介绍: 工作流程 用户首先将自己的加…

9,STL——vector类

一、vector类的介绍和使用 1,了解vector vector类的官方介绍https://cplusplus.com/reference/vector/vector/ 使用STL的三个境界:能用,明理,能扩展 1). vector是表示可变大小数组的序列容器。 2). 就像数组一样,…

【Vue】let、const、var的区别、适用场景

let、const、var,有哪些区别,适用场景 var 特点: var 是 JavaScript 中最传统的变量声明方式。具有函数作用域,即在函数内声明的 var 变量,在整个函数内都可以访问。变量提升:使用 var 声明的变量会被提升…

Android车机DIY开发之学习篇(二)编译Kernel以正点原子为例

Android车机DIY开发之学习篇(二)编译Kernel以正点原子为例 1.代码在/kernel-5.10文件夹下 2.在kernel-5.10目录下执行如下命令编译 : 编译之前,需要将 clang 导出到 PATH 环境变量: 如果是 Android12 执行下面这条命令 export PATH../pr…

QT3学习之qpainter学习

QImage img;QPixmap savedPixmap(sourceRect.size());QPainter savedPainter(&savedPixmap);// 使用 QPainter 从 bufferPixmap 复制指定区域savedPainter.drawPixmap(sourceRect,bufferPixmap);// 将 QPixmap 转换为 QImageQImage image savedPixmap.convertToImage();if…

web.xml常用配置

web.xml是Java Web应用程序的部署描述文件,它位于WEB-INF目录下。web.xml文件主要用于配置Servlet、Filter、Listener、MIME类型、欢迎页面等组件,以及一些Web应用的上下文参数。以下是一些常见的web.xml配置说明: Servlet配置: …

基于考研概率论知识解读 Transformer:为何自注意力机制要除以根号 dk

Transformer自注意力机制中除以 d k \sqrt{d_k} dk​ ​深度剖析 【 Transformer 系列,故事从 d k \sqrt{d_k} dk​ ​说起】 LLM这么火,Transformer厥功甚伟,某天心血来潮~,再去看看! 它长这个样子: 深入…

二进制、八进制、十进制和十六进制的相互转换

printf 函数 printf 函数是 C 语言中用于将格式化的数据输出到标准输出(通常是屏幕)的函数。它位于 stdio.h 头文件中,因此在使用之前需要包含该头文件。 printf 函数的格式说明符 格式说明符说明示例%d 或 %i输出或输入十进制有符号整数p…

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息 Kafka生产者——向Kafka写入数据 不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写…

类模板的使用方法

目录 类模板的使用方法 1.类模板语法 2.类模板和函数模板区别 3.类模板中成员函数创建时机 4.类函数对象做函数参数 5.类模板和继承 6.类模板成员函数类外实现 7.类模板分文件编写 person.hpp 实现cpp文件: 8.类模板与友元 9.类模板案例 MyArray.hpp …

Android SystemUI——使用Dagger2加载组件(四)

SystemUI 是 Android 系统中的一个重要模块,负责绘制系统栏(如状态栏、导航栏)、锁屏、快捷设置等用户界面元素。由于其复杂性,良好的架构设计和依赖管理对于保持代码的可维护性和扩展性至关重要。这就是 Dagger2 在此发挥重要作用的地方。 一、Dagger2介绍 Dagger2 是一个…