当前位置: 首页 > news >正文

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

一. .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.jsqmd.com/news/20566/

相关文章:

  • 承插焊异径三通源头厂家推荐上海结申,专业制造高压承插管件
  • 【10.29 直播】IoTDB 图形化工具与编程框架集成实操
  • 锻造承插三通厂家专业技术对比,上海结申管件承压性能提升28%使用寿命延长35%
  • 2025棒球帽/卫衣/羽绒服品牌推荐,COVERNAT潮流服饰厂家精选
  • 如何在CentOS 7上安装bzip2-1.0.6-13.el7.x86_64.rpm RPM包(详细步骤) - 详解
  • 上海结申管件制造有限公司:承插焊异径三通、承插焊Y型三通、高压承插管件、锻造承插三通源头厂家
  • harbor基于自建证书部署HTTPS及k8s集群
  • python练习 石头剪刀布
  • 基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
  • 2025 年度撕碎机厂家最新推荐权威榜单:涵盖金属 / 塑料 / 木材 / 固废等多物料处理,精选实力企业破解选型难题
  • 【IEEE出版】第六届计算机通信与网络安全国际学术会议(CCNS 2025)
  • C程序设计语言_1.1_开篇入门
  • playwright自动化测试应用-Day1
  • 2025 年货架源头厂家最新推荐排行榜:仓储 / 重型 / 阁楼 / 穿梭式等各类货架优质企业甄选
  • 2025年10月广州办公室设备搬运公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 2025年专业的上海Micro-LED显示屏推荐TOP生产厂家
  • 2025年质量好的工业不锈钢链轮最新TOP厂家推荐
  • 2025年正规的广州智能洗碗机,广州洗碗机设备厂家最新推荐榜
  • 改进的(μ+λ)约束差分进化算法设计与实现
  • 2025年10月旋转接头厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 实用指南:Java 高效实现 PowerPoint 转 PDF:不依赖Office
  • 2025年可靠的立式明装风机盘管直销制造
  • 2025年靠谱的FCC催化剂拟薄水铝石厂家推荐及采购指南
  • 2025年10月江苏机械设备EAC认证公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 2025年热门的镁制硅晶防火风管,漂珠硅晶防火风管实力源头
  • 2025连接器厂家推荐皓富电子,专注USB/电池/TYPE-C/防水接口专业制造
  • 2025耳机/DC/防水耳机插座厂家推荐皓富电子,专业品质保障
  • 2025年知名的四川岩棉板,A级防火岩棉板推荐TOP品牌厂家
  • 2025/10/23
  • 2025年评价高的磁力齿轮泵,小型齿轮泵厂家推荐及选择建议