C++生成.dll文件后在Python中引用(包括传递参数是double型、char*数组,接收参数也为数组)

news2025/1/16 15:41:46

一、问题描述

博主想要实现的C++函数原型如下:

double* getInfo(int flag, double xyz[], char *xodrPath)

也就是需要传递参数为三个不同类型的参数,返回值为double类型的指针(数组)。

那么如何在Python中如何通过这个函数生成的.dll文件调用getInfo()函数,并将返回参数进行输出呢?

二、动态链接库(.dll)生成

在cmakeList.txt中添加语句:

add_library(libOdr SHARED getOdr.cpp)
target_link_libraries(libOdr ${ODRMANGER_LIB}/libproj.dll.a ${ODRMANGER_LIB}/libODrive.1.5.5.a)

上述语句中,libOdr是指定生成的库文件的名字,注意其生成的时候会自动添加lib关键字所以实际上生成的库文件全名是liblibOdr.dll,如图所示:

在这里插入图片描述
SHARED 表示生成动态链接库也就是后缀名为.dll的库文件;若需要生成静态链接库关键字改为STATIC即可。

getOdr.cpp这是需要生成库文件的.cpp文件,比如博主需要封装的getInfo()方法就是在.cpp文件中。

这条语句中,后边两个非必须项,是博主运行代码需要的链接库,如果.cpp中代码运行不需要链接库则无需添加,只需要target_link_libraries(libOdr) 即可。

上述文件编辑好后,clion可以直接ctrl+F9进行编译,即可在bin目录下看到生成的库文件;也可以

手动点击build进行编译生成库文件。

后续每次更新.cpp文件后都可以直接点Bulid下拉列表中Rebuild就可以重新生成.dll文件。

三、Python中引用

3.1 首先需要导入头文件:

from ctypes import *

3.2 库和函数调用

from ctypes import *

def getOdr(flag, pos, xodrPath):
    # 调用该连接库
    dll = CDLL('F:/libOdr.dll')
    
    # 设定调用函数的返回数据类型,博主是长度为6的double指针数据类型,
    dll.getInfo.restype = POINTER(c_double * 6)
    
    # 将函数参数float数组pos(Python中为float)预处理为C++中的double类型数组
    xyz3 = c_double * 3
    xyz = xyz3()
    for i in range(3):
        xyz[i] = pos[i]

    # 将函数参数预处理为C++中的char*类型(string),这里直接将长度设置为了100可灵活更改
    xodr = (c_char * 100)(*bytes(xodrPath, "utf-8"))
    cast(xodr, POINTER(c_char))
    
    # 调用目标函数getInfo()
    posInfo = dll.getInfo(flag, xyz, xodr)
    result = []
    for i in range(6):
        # 将函数返回结果存储到result数组中
        result.append(posInfo.contents[i])
    return result

说明:

  • CDLL()这个方法是调用链接库的方法(必要的),调用的时候在括号里添加库文件的路径即可,比如博主的.dll文件是在F盘。
  • 代码中的数字可根据实际情况灵活更改
  • C++中的string类型必须通过char*类型通过如上代码进行处理

上述代码中头文件是引用的from ctypes import *,也可以直接 import ctypes ,此时相关代码则需要加上ctypes.,如下:

import ctypes

def getOdr(flag, pos, xodrPath):
    dll = ctypes.CDLL('F:/libOdr.dll')
    dll.getInfo.restype = ctypes.POINTER(ctypes.c_double * 6)
    # char_p_test = bytes("中国", "utf8")  # 汉字需用采用utf8编码
    xyz3 = ctypes.c_double * 3
    xyz = xyz3()
    for i in range(3):
        xyz[i] = pos[i]

    xodr = (ctypes.c_char * 100)(*bytes(xodrPath, "utf-8"))
    ctypes.cast(xodr, ctypes.POINTER(ctypes.c_char))
    posInfo = dll.getInfo(flag, xyz, xodr)
    result = []
    for i in range(6):
        result.append(posInfo.contents[i])
    return result

main函数不变。

四、函数运行

main函数:


if __name__ == '__main__':
    flag = 1
    # pos = [5915.00, -2937.76, 0]
    pos = [40, -1, 20.1659]
    xodrPath = "D:/MCworkspace/odrParser/data/Germany_2018.xodr"
    posInfo = getOdr(flag, pos, xodrPath)
    for i in posInfo:
        print(i)

在这里插入图片描述

图中红框部分数据即为调用函数后返回的6个double类型数据。

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

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

相关文章

完全兼容GM8775C方案|替代GM8775C设计|CS5518替代GM8775C DSI转双LVDS设计方案

GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能。GM8775C输入端DSI符合 协议支持 MIPI D-PHY 1.00.00 和MIPI DSI 1.02.00,可实现 1 到 4通道 DSI 信号接收。最大数据率 1Gbps/通道。视频输入格式支持 16bit RGB565、18bit RGB6…

Mybatis 一对一、一对多、多对多

今天我们来复习一下 Mybatis 框架吧 总所周知,Mybatis 是一款优秀的 基于ORM 半自动 轻量化 的 持久层框架 ORM:对象关系映射,简单的说就是表结构对应实体类 半自动:可灵活配置SQL,优化代码性能 轻量化&#xff1a…

php源代码保护——PHP加密方案分析解密还原

前言 php是一种解释型脚本语言.与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 . 在php源代码的保护在原理可以分为3大类. 源代码混淆(编码)OPCODE混淆(编码)修改解释引擎(虚拟机) 在部署上可…

Vue学习笔记 ④

文章目录template 选项Vue 生命周期生命周期图示生命周期钩子beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed组件基础组件是什么?组件注册全局组件局部组件组件名组件复用自闭合组件组件的 data 选项单个根元素组件\_Prop注册自定…

怎么排除无效问卷?

目录 1、答题限制 1)设置问卷验证码/密码 2)设置填写唯一链接 2、题目设置 1)设置陷阱题目 2)打乱题目顺序 3)设置跳转逻辑 4)题目数量限制 3、问卷筛选 问卷调查是一种能够在进行社会调研时帮助我…

SAP ABAP发送HTML格式的邮件

输入参数: I_SUBJECT:内容的简短描述 IT_MESSAGE_BODY:邮件主体部分(convert string to table) IT_ATTACHMENTS:附件内容 I_SENDER_MAIL:发送者的电子邮件地址 I_ATTMSG_CHECK:…

浙大MBA/MPA/MEM复试中的五大认知误区

在每年的研究生复试过程中都不乏大意失荆州者,经过联考初试的洗礼走到复试环节,却因为录取排名的变化而止步于录取大门口。在这些案例中,不少考生其实是针对复试这个环节有诸多认知误区,本期杭州达立易考结合MBA/MEM/MPA在职类硕士…

CentOS配置静态IP

CentOS配置静态IP1.获取VMnet8虚拟网卡的网段2.编辑虚拟机虚拟网络3.虚拟机中网络配置4.验证配置1.获取VMnet8虚拟网卡的网段 通过ipconfig -all查询VMnet8网卡的网段,这个等会需要使用 这里是:192.168.177 这里注意,还需要记录一下宿主机&…

rust字符串

字符串类型 诸位在入门rust的时候,要认真,因为字符串类型在rust中有好几种,一不小心就搞混了类型,导致代码编译报错。好在有强大的rust-analyzer和vscode帮助我们。我们直接通过一段代码来开始认识rust的字符串类型。 fn main()…

nginx学习笔记5(小d课堂)

全局异常兜底数据返回 我们如果访问的路径不存在,会给我们返回一个404.那么我们就可以通过nginx配置去返回兜底数据: 修改完配置,重启nginx。 这样我们就返回我们的兜底数据了。 nginx封禁恶意ip 我们现在随便选择一个ip进行封禁测试。 我们现…

.Net Core 6.0 WebApi配置跨域

ASP.Net Core 6.0 WebApi配置跨域 Program.cs文件代码如下: //配置跨域 builder.Services.AddCors(cor > {var cors configuration.GetSection("CorsUrls").GetChildren().Select(p > p.Value);cor.AddPolicy("Cors", policy >{poli…

92、【树与二叉树】leetcode ——111. 二叉树的最小深度:层次遍历+先序DFS+后序DFS[子问题分解](C++版本)

题目描述 原题链接:111. 二叉树的最小深度 解题思路 1、迭代法:层序遍历BFS 最小深度的特点是第一次遍历到结点的左右指针为NULL,此时该路径为最短路径。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

探索SpringMVC-组件之HandlerExceptionResolver

前言 在介绍完Handler、HandlerAdapter、HandlerMapping之后,剩下的比较关键的组件就是HandlerExceptionResolver、ViewResolver。其他的像国际化、主题、文件上传、重定向,这些锦上添花的组件都是一个框架需要关心的。但不是我们平常使用的核心功能&am…

蓝桥杯省赛习题练习(三)

题目来源&#xff1a;2022年第十三届省赛(B组)真题 目录1.九进制转十进制运行结果2. 顺子日期运行结果3. 刷题统计运行结果4. 积木画1.九进制转十进制 问题描述&#xff1a;九进制正整数 (2022)9 转换成十进制等于多少&#xff1f; #include<stdio.h> #include<math.h…

一文带你深入了解线程池

目录一. 什么是线程池二. 为什么要使用线程池三. 线程池的参数四. 线程池的工作流程五. 使用Executors 创建常见的功能线程池一. 什么是线程池 简单来说&#xff0c;线程池就是提前创建好一批线程&#xff0c;当有任务的时候&#xff0c;从池子中取出一个线程去执行该任务&…

再说多线程(二)——细说Monitor类

在上一节我们已经讨论了使用Lock来保证并发程序的一致性&#xff0c;Lock锁是借助了Monitor类的功能。本节将详细的介绍Monitor类&#xff0c;以及如何通过Monitor类的成员函数实现并行程序的一致性。1.Monitor类介绍根据微软的说法&#xff0c;C#中的监视器类提供了一种同步对…

Microsoft Visual SourceSafe的使用

1、介绍 Microsoft Visual SourceSafe&#xff0c;简称vss。是一款早期微软推出的版本管理工具。跟据官方的定义&#xff0c;vss有两种控制模式&#xff1a;独占&#xff08;Lock-Modify-Unlock Model&#xff09;和并行&#xff08;Copy-Modify-Merge Model&#xff09;。独占…

程序的安装——软件安装包的制作、软件源的使用

读书笔记 —— 《嵌入式C语言自我修养》 软件安装 linux 安装包的制作 编译 软件安装包路径 使用dpkg命令来制作安装包 及 安装包的卸载 软件仓库 更新源 查看具体需要更新的软件包 更新软件包 软件安装 软件安装的过程其实就是将一个可执行文件安装到ROM的过…

安全狗云原生安全从1.X到2.X的演变之路(1)

随着云计算技术的蓬勃发展&#xff0c;传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展&#xff0c;成为赋能业务创新的重要推动力&#xff0c;并已经应用到企业核心业务。然而&#xff0c;云原生技…

大型数据中心分层分布式谐波治理方案设计与效果分析

摘要&#xff1a;数据中心行业在国民经济中起到了不可替代的作用,但其繁多的非线性电力负载,如通讯系统、大型计算机、网络控制设备、变频空调、各种数码办公设备、灯光调控系统、UPS、监控系统等给其供电系统带来了严重的谐波干扰,对大型数据中心的运行安全造成了较大的威胁,为…