详细介绍:python(73) 引用.dll文件并调用函数

news/2025/10/23 17:50:55/文章来源:https://www.cnblogs.com/yxysuanfa/p/19161272

一. .dll文件生成

c++代码 .cpp文件

#include
// 导出函数声明,供外部调用
extern "C" __declspec(dllexport) int add(int a, int b);
extern "C" __declspec(dllexport) void greet();
// 函数实现
int add(int a, int b) {
return a + b;
}
void greet() {
std::cout << "Hello from MyDLL!" << std::endl;
}

windows环境下使用命令生成.dll

g++ -shared -o demo.dll demo.cpp -Wl,--out-implib=libdemo.a -static-libstdc++

命令参数说明:
-shared:指定生成动态链接库(.dll)-o mydll.dll:指定输出的 DLL 文件名
-Wl,--out-implib=libmydll.a:生成导入库(.a 文件),供其他程序链接时使用
执行成功后,会生成三个文件:
mydll.dll:动态链接库本体
libmydll.a:MinGW 格式的导入库
mydll.exp:导出符号文件(辅助文件)
libstdc++
-static-libstdc++:静态链接 C++ 标准库,将std::cout等实现打包到你的 DLL 中

二. python引用.dll文件

from ctypes import *
pdll = CDLL("E:\\project\\dll_demo\\demo.dll")
c = pdll.add(1,2)
print(c)
pdll.greet()

python调用结果

3
Hello from MyDLL!

三.版本注意

注意python shuyu 32位还是64位版本  须与dll文件版本一致

python版本查询

import platform
print(platform.architecture())

版本不匹配则会报错 not win32 类的错误

Windows端gcc32/64位版本查看

查看gcc属于32位还是64位
gcc -v
在输出的信息中,查找包含 target 的行:
如果显示 target: x86_64-w64-mingw32 或 x86_64-linux-gnu,说明是 64 位 gcc
如果显示 target: i686-w64-mingw32 或 i686-linux-gnu,说明是 32 位 gcc

windows端使用mingw编译c++文件为dll

使用下载的mingw-w64-gcc-14.3-stable-r43 目录下的:x86_64-w64-mingw32-g++.exe  -shared -o demo.dll demo.cpp -Wl,--out-implib=libdemo.a -static-libstdc++  则为64位

下载路径:https://files.1f0.de/mingw/

相关镜像源

GCC国内下载镜像:

https://mirrors.aliyun.com/gnu/gcc/gcc-12.2.0

https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/

mingw:

http://files.1f0.de/mingw/

https://mirrors.tuna.tsinghua.edu.cn/cygwin/x86_64/release/mingw64-x86_64-gcc/

https://mirrors.aliyun.com/cygwin/x86_64/release/mingw64-x86_64-gcc/?spm=a2c6h.25603864.0.0.7e6e914f7b7392

四.调用函数时的入参出参声明

4.1 按照c语言数据类型 与ctypes数据类型映射关系进行声明

c++头文件参数情况

python调用前参数声明情况

在 Python 中使用 ctypes 调用 C++ DLL 时,对于 C++ 自定义的枚举(enum)类型入参,需要在 argtypes 中指定对应的整数类型。这是因为 C++ 枚举在底层本质上是整数类型(通常是 int),ctypes 没有专门的枚举类型映射,需用整数类型替代。

4.2特殊传参处理方法

枚举值

c++函数定义为枚举类型入参时,在python调用时可声明入参类型为整型

结构体

c++函数定义入参类型为结构体时,python调用前声明也应为结构体,使用ctypes.Structure类:

// 结构体定义
struct MyStruct {
int id;
float value;
char name[50];
};
// 函数定义
extern "C" __declspec(dllexport) void process_struct(MyStruct input);
import ctypes
# 定义与C++结构体对应的Python类
class MyStruct(ctypes.Structure):
_fields_ = [
("id", ctypes.c_int),          # 对应int id
("value", ctypes.c_float),     # 对应float value
("name", ctypes.c_char * 50)   # 对应char name[50]
]
# 加载DLL
mydll = ctypes.CDLL("mydll.dll")
# 声明函数参数类型
mydll.process_struct.argtypes = [MyStruct]
mydll.process_struct.restype = None  # 如果函数无返回值
# 创建结构体实例并赋值
data = MyStruct()
data.id = 123
data.value = 3.14
data.name = b"test"  # 字符串需要用字节类型
# 调用函数
mydll.process_struct(data)

参考文件

https://juejin.cn/post/7209906040921538620

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

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

相关文章

承插焊异径三通源头厂家推荐上海结申,专业制造高压承插管件

在工业管道系统领域,承插焊异径三通作为关键连接部件,其质量直接关系到整个管道系统的安全性与效率。为提供客观的行业参考,本报告通过对业内主要生产企业的产能规模、技术研发实力、产品质量管控及市场应用数据等多…

【10.29 直播】IoTDB 图形化工具与编程框架集成实操

10.29 19 点,助你实现跨平台图形化操作,快速搭建系统模块!🔍你是否曾为时序数据库 IoTDB 的命令行操作而烦恼? 🚀是否希望像使用 MySQL 一样,通过熟悉的 GUI 工具轻松管理和查询时序数据? 📌到底如何将 Io…

锻造承插三通厂家专业技术对比,上海结申管件承压性能提升28%使用寿命延长35%

在石油化工、市政工程等工业领域,锻造承插三通作为管道系统的关键连接部件,其承载强度、密封性能及耐久性直接关系到整个系统的安全运行。随着工业基础设施升级,市场对高强度、高精度管件的需求持续增长。本报告基于…

2025棒球帽/卫衣/羽绒服品牌推荐,COVERNAT潮流服饰厂家精选

2025棒球帽/卫衣/羽绒服品牌推荐,COVERNAT潮流服饰厂家精选 当前棒球帽、卫衣、羽绒服领域的技术挑战 在时尚服饰行业快速发展的今天,棒球帽、卫衣和羽绒服作为日常穿搭的重要组成部分,面临着诸多技术挑战。根据行业…

如何在CentOS 7上安装bzip2-1.0.6-13.el7.x86_64.rpm RPM包(详细步骤) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

上海结申管件制造有限公司:承插焊异径三通、承插焊Y型三通、高压承插管件、锻造承插三通源头厂家

在石油化工、市政工程等工业领域,承插焊Y型三通作为管道系统的关键连接部件,其密封性能、承压能力及使用寿命直接关系到整个系统的安全运行。据2025年行业调研数据显示,全球工业管件市场规模预计突破800亿美元,其中…

harbor基于自建证书部署HTTPS及k8s集群

harbor基于自建证书部署HTTPS及k8s集群docker和k8s的时间简史时间阶段关键事件萌芽与诞生(2013-2014) • 2013: Docker开源 (基于go语言编写)• 2014: Google公司开源Kubernetes,默认以Docker 为运行时• 生态分化: D…

python练习 石头剪刀布

目标 1.强化多条件的逻辑运算 2.体会import导入random模块的使用 需求 3.从控制台输入要出的拳--石头1、剪刀2、布3 4.电脑随机出拳 代码实现 import random while True: num=random.randint(1,3) compute=num me=int(…

基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南

本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。作者:如漫、席翁 AI Agent 的构建模式正在从“单个智能体做所有事”走向“多个专精智能体协作…

2025 年度撕碎机厂家最新推荐权威榜单:涵盖金属 / 塑料 / 木材 / 固废等多物料处理,精选实力企业破解选型难题

当前,再生资源回收利用行业规模持续扩大,撕碎机作为物料处理的核心设备,定制化需求愈发旺盛。然而,市场上厂家水平参差不齐,多数缺乏细分领域技术储备,无法针对不同物料特性提供适配方案,导致设备效率低下;部分…

基于WPF实现打印机连接与打印功能

一、项目配置创建WPF项目 dotnet new wpf -n WpfPrinterDemo cd WpfPrinterDemo添加必要引用System.Printing(用于打印机管理) System.Windows.Controls(界面控件)二、界面设计 (MainWindow.xaml) <Window x:Cl…

Windows 命令行查看COM口

习惯了在Linux中直接通过命令查看串口,但是Windows一般都是去 “设备管理器 --> 端口” 查询,那么有没有一种可以通过命令行的方式查询呢? 有的,我问了一下DeepSeek,它给出了详细的命令,就是有点长。 PS D:\9…

【IEEE出版】第六届计算机通信与网络安全国际学术会议(CCNS 2025)

由江苏第二师范学院主办的第六届计算机通信与网络安全国际学术会议(CCNS 2025)(线上会议)将于10月31日至11月2日在中国南京召开。【本会议已签约IEEE,授权征稿,发文靠谱!】 【本会议被江苏第二师范学院认可、推…

2025 年最新推荐编织袋源头厂家排行榜:聚焦全自动智能节能设备,助力企业选对优质厂商工业 / 数控 / 重型 / 多功能 / 自动编织袋设备推荐

引言 当前编织袋生产行业飞速发展,企业对设备的需求日益多元化,然而市场上设备厂家良莠不齐,给企业选型带来极大困扰。部分厂家设备性能不稳定,导致生产效率低下、成本攀升;有些厂家缺乏完善售后,设备故障时企业…

C程序设计语言_1.1_开篇入门

C程序设计语言_1.1_开篇入门绝大多数C/C++初学者的第一个程序是打印以下字符串:Hello world!对于入门者而言,个人认为下列部分可能成为障碍:(1) 程序文本编写,了解基本程序结构,亦或者说那些不可或缺的要素;(2) …

playwright自动化测试应用-Day1

# 1. 安装# pip install playwright ## Playwright要求Python 3.7及以上。python --version 或 python3 --version查看# playwright install# python -m pip install --upgrade pip -i https://pypi.…

2025 年货架源头厂家最新推荐排行榜:仓储 / 重型 / 阁楼 / 穿梭式等各类货架优质企业甄选

引言 当前物流仓储行业高速发展,企业对货架的需求持续攀升,但市场上货架源头厂家数量繁杂,产品质量、技术实力与服务水平差异显著。部分厂家存在原材料不达标、生产工艺落后等问题,导致货架承载力不足,埋下安全隐…

2025年10月广州办公室设备搬运公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析

在现代商业环境中,办公室设备搬运是一项高度专业化的服务,涉及精密仪器、档案文档和大型办公家具的安全转移。广州作为华南经济中心,企业对设备搬运的需求日益增长,要求服务商具备强大的运营能力、专业技术和可靠保…

2025年专业的上海Micro-LED显示屏推荐TOP生产厂家

2025年专业的上海Micro-LED显示屏推荐TOP生产厂家 引言 随着显示技术的飞速发展,Micro-LED显示屏凭借其高亮度、高对比度、长寿命和低功耗等优势,正逐渐成为高端商业显示、会议室、舞台演出、广告传媒等领域的首选…

2025年质量好的工业不锈钢链轮最新TOP厂家推荐

2025年质量好的工业不锈钢链轮最新TOP厂家推荐工业不锈钢链轮市场概述工业不锈钢链轮作为机械传动系统中的核心部件,广泛应用于食品加工、制药、化工、海洋工程等对耐腐蚀性要求高的领域。随着工业4.0和智能制造的发展…