Python调用C++程序实现

embedded/2025/2/6 6:05:02/

基本环境说明

由于C++的执行速度快、控制粒度细,Python上层开发方便、迭代速度快,故经常可以遇到C++写好接口供Python调用的情况,但是其中bug还不少(尤其是动态链接库一个链接另一个,就会产生比较复杂的关系)
我这里算试出了一种解决方案,供大家参考
尝试了g++,实在没解决动态库相互链接的问题,最后用CMake解决的

具体实现

整体思路

C++做完封装后,用CMake生成动态链接库.so,在Python中使用Ctypes调用该动态链接库中的函数

CMakeLists.txt

# src/CMakeLists.txt# 查找源代码文件
set(SOURCE_FILES main.cpp)# 生成可执行文件
add_executable(main ${SOURCE_FILES})
# 生成.so
add_library(ctrl SHARED ${PROJECT_SOURCE_DIR}/source/base_ctrl.cpp)
# link_directories(/home/xxx/Desktop/aheadform/xxxxx/Proj_01/lib)
target_link_libraries(ctrl /home/xxx/Desktop/aheadform/xxxxx/Proj_01/lib/ccc.so)# 设置库文件的路径
link_directories(${CMAKE_SOURCE_DIR}/lib)set(EYOU_LIB_PATH ${CMAKE_SOURCE_DIR}/lib)# add_executable(test main.cpp)target_link_libraries(main ${EYOU_LIB_PATH}/libeu_harmonic.so pthread)

add_executable用于生成可执行文件,也就是编译后的结果
add_library用于生成动态链接库
target_link_libraries用于告知CMake,生成动态链接库时,需要依赖什么库
link_directories用于告知CMake,依赖的库需要去哪里调用,我这里图方便,直接在target_link_libraries里就写了绝对地址

Python

C++


http://www.ppmy.cn/embedded/159946.html

相关文章

MySQL 插入数据

MySQL 插入数据 引言 在数据库管理系统中,MySQL 是一款广泛使用的开源关系型数据库管理系统。数据插入是数据库操作的基础之一,它涉及将数据添加到数据库的表中。本文将详细介绍 MySQL 中插入数据的方法,包括基本的插入语法、多行插入、以及…

大语言模型极速部署:Ollama 与 One-API 完美搭建教程

大语言模型极速部署:Ollama 与 One-API 完美搭建教程 本文将介绍如何通过命令行工具部署 Ollama 和 One-API,帮助你快速搭建私有化大模型。 一、安装 Ollama Ollama 是一个容器化的应用,方便部署和管理 AI 模型。以下是安装 Ollama 的步骤。…

Sqli-labs靶场实录(一):Basic Challenges

sqli-labs靶场实录:Basic Challenges sql手注基本流程Less-11.1探测注入点1.2判断字段数1.3判断回显位1.4提取数据库基本信息1.5拖取敏感数据 Less-2Less-3Less-4Less5爆表爆列名 Less6爆库爆表爆列名 Less7猜解数据库长度逐字符爆破数据库名 Less8爆库 Less9爆库 Less10Less11…

docker和k8s实践

Docker 和 Kubernetes 是现代云原生应用开发和运维中的两个重要技术。Docker 提供容器化技术,可以将应用及其依赖打包在容器中,而 Kubernetes 则负责容器的编排、部署、伸缩和管理。以下是 Docker 和 Kubernetes 的实践指南,涵盖基础安装、配…

C_位运算符及其在单片机寄存器的操作

C语言的位运算符用于直接操作二进制位,本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符(&) 功能:按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…

双亲委派(jvm)

1.双亲委派 在 Java 中,双薪委派通常是指双亲委派模型,它是 Java 类加载器的一种工作模式,用于确保类加载的安全性和一致性。以下是其相关介绍: 定义与作用 定义:双亲委派模型要求除了顶层的启动类加载器外&#xf…

Maven全解析:Maven 进阶

pom.xml 文件: 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖 坐标: 构建的唯一标识含义: groupId:组织标识。一般为:公司网址的反写 项目名artifactId:项目名称。一…

【JavaEE】Spring(7):统一功能处理

一、拦截器 拦截器的使用步骤: 定义拦截器注册配置拦截器 1. 定义拦截器 Slf4j Component public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Objec…