当前位置: 首页 > 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.gsyq.cn/news/28574.html

相关文章:

  • harbor基于自建证书部署HTTPS及k8s集群
  • Windows 命令行查看COM口
  • 【IEEE出版】第六届计算机通信与网络安全国际学术会议(CCNS 2025)
  • playwright自动化测试应用-Day1
  • 改进的(μ+λ)约束差分进化算法设计与实现
  • 2025耳机/DC/防水耳机插座厂家推荐皓富电子,专业品质保障
  • 2025年口碑好的载带成型机厂家最新权威推荐榜
  • Mac Jenkins 环境部署
  • 达梦数据库(DM)同机 异机备份到 MinIO(Java 实现 干货直给)
  • 氛围编程:IT领导者须知
  • Day22-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\File-FileTest1~4
  • 实用指南:计算机中用8位如何计算最大值和最小值-128~127
  • 权威调研榜单:徐州CCC产品认证公共服务平台TOP3榜单好评深度解析
  • 权威调研榜单:落地立式护眼灯厂家TOP3榜单好评深度解析
  • 详细介绍:C++面向对象编程——引用
  • 2025 年道闸源头厂家最新推荐排行榜:聚焦专利技术与多场景适配的权威优选指南直杆/ 栅栏道闸/道闸停车场系统/道闸识别一体机/道闸系统公司推荐
  • 精控DRC,成就高质量IC设计精品
  • 完整教程:【uniapp】uniapp+uview-ui+mixins实现搜索+上拉加载+加载动画功能:
  • 2025 年天津老味儿刨冰最新推荐榜:精选 5 家世代传承与新兴热门品牌,附品质选择指南
  • RTX5060TI 配置Xinference
  • js函数声明和函数表达式的理解
  • P13382 解题报告
  • 免费搜索下载ICON图标的网站
  • 6ES7592-1BM00-0XA0 32路dq接线端子
  • Excel 实现下拉多选功能
  • CodeForces-1620D Exact Change
  • Python爬虫:获取某平台数据的下载链接 - 指南
  • 厨房电子秤芯片方案:SIC8632
  • 贡献法算法思维
  • 让cherry studio访问使用Docket Desktop中的Docker Model Runner运行的模型