C++编译为动态链接库并用python调用

将C++函数编译为动态链接库并用python调用

环境:win10 | vs2019 | python3 | ctype

① 创建 dll 项目在这里插入图片描述

② 创建自己的头文件和源文件,自动生成的不用管(这样后面会有一个报错,改下设置就 ok l)
在这里插入图片描述

③ 需要导出让 python 调用的函数加一些关键字声明,其余的函数不用管,加的原因网上很多,不多说
将C/C++编译为动态链接库并供python调用其函数_潇洒过路客的博客-CSDN博客_编译成动态链接库以便python环境下可以被调用
在这里插入图片描述

④ 运行后,会报错,这个报错正常,生成成功就ok了
这里会报错 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h“
属性-预编译头-不使用预编译头
使用vs2019用c++创建dll库_xujianjun229的博客-CSDN博客_vs2019创建c++dll
在这里插入图片描述

运行后的界面
在这里插入图片描述

⑤ 我用的release ,所以生成的 dll 在release 里面,调用的库不同这里的dll数量也不同
在这里插入图片描述

⑥ 把 Dll1.dll 以及 他依赖的其他 dll 一起放到 python 脚本的同级目录(可以把release文件夹所有dll复制过去),不然可能会报错 找不到某个 dll
在这里插入图片描述

⑦最好在 c++ 设置一下输出,看一下c++接到的 数据是否正确
我这里需要传几个路径,所有用了一个结构体。注意c++ 和 python 之间的数据转换问题
python 使用ctypes调用C/C++ dll - 我来乔23 - 博客园 (cnblogs.com)

地址不对会报错: OSError: [WinError -529697949] Windows Error 0xe06d7363

⑧整个过程各种踩坑
留个坑:我这里的函数没有返回值,当我试着返回一张图时,会报错:
OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF
有说是内存的问题,不知道怎么破???

当我们需要在Python调用C++程序时,我们通常会选择将C++程序编译成动态库(.dll或.so文件),然后在Python中引用它。下面是一些步骤: 1.编写C++程序并将其编译为动态库,例如Windows平台上的.dll文件或Linux平台上的.so文件。 2.使用Python中的ctypes模块来加载动态库,并调用其中定义的函数。这个过程需要知道动态库中函数的名称和参数类型。 3.在Python调用动态库中的函数,获取返回值并进行处理。 以下是一个简单的示例代码: 假设我们有一个C++程序,包含一个名为add_numbers的函数,它接受两个整数并返回它们的和。 ```c++ // add_numbers.cpp #include "add_numbers.h" int add_numbers(int x, int y) { return x + y; } ``` 我们可以将其编译Windows平台上的.dll文件,使用以下命令: ``` g++ -shared -o add_numbers.dll add_numbers.cpp ``` 在Python中,我们可以使用以下代码来加载动态库,并调用其中的函数: ```python import ctypes # 加载动态库 add_numbers_lib = ctypes.WinDLL('add_numbers.dll') # 获取函数 add_numbers = add_numbers_lib.add_numbers # 设置参数类型 add_numbers.argtypes = [ctypes.c_int, ctypes.c_int] # 设置返回值类型 add_numbers.restype = ctypes.c_int # 调用函数 result = add_numbers(1, 2) print(result) # 输出3 ``` 相关问题: 1. C++程序编译成动态库有哪些优点? 2. Python如何加载动态库? 3. 如何在Python调用动态库中的函数?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值