在centos7中利用pybind11构建C++的动态库供python调用

在centos7中利用pybind11构建C++的动态库供python调用

      • 步骤 1:安装依赖
      • 步骤 2:获取 pybind11 头文件
      • 步骤 3:编写绑定代码
      • 步骤 4:编译动态库
      • 步骤 5:在 Python 中调用
      • 编译命令解释
      • 注意

需求:在 CentOS 7 中,使用 pybind11 构建 C++ 的动态库供 Python 调用涉及几个步骤:安装依赖、获取 pybind11、编写绑定代码、编译动态库,以及在 Python 中调用。以下是详细的步骤:

步骤 1:安装依赖

首先,确保系统中安装了 Python、pip 和 C++ 编译环境:

sudo yum install epel-release
sudo yum update
sudo yum install gcc-c++ python3 python3-pip python3-devel

接着,使用 pip 安装 pybind11:

pip3 install pybind11

步骤 2:获取 pybind11 头文件

通过 pip 安装 pybind11 后,你可以在 Python 站点包目录中找到 pybind11 的头文件。使用以下命令查找 pybind11 的安装位置:

pip3 show pybind11 | grep Location

记下头文件的路径,你将在编译时需要它。

步骤 3:编写绑定代码

创建一个 C++ 文件(例如 example.cpp),并使用 pybind11 编写绑定代码。下面是一个简单的例子:

#include <pybind11/pybind11.h>int add(int i, int j) {return i + j;
}namespace py = pybind11;PYBIND11_MODULE(example, m) {m.doc() = "pybind11 example plugin"; // 模块文档字符串m.def("add", &add, "A function which adds two numbers");
}

步骤 4:编译动态库

使用 c++ 命令手动编译动态库。你需要指定 Python 包含的目录、pybind11 包含的目录以及输出的动态库名称。根据你的 Python 版本和 pybind11 的安装位置,命令可能有所不同。以下是一个编译示例:

c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)

这条命令将生成一个动态库(例如 example.cpython-36m-x86_64-linux-gnu.so),可以被 Python 导入。

步骤 5:在 Python 中调用

在同一目录下,启动 Python 解释器,然后导入你的模块并调用函数:

import example
print(example.add(1, 2))

如果一切正常,这将输出 3

编译命令解释

c++ -O3 -Wall -shared -std=c++11 -fPIC ( p y t h o n 3 − m p y b i n d 11 − − i n c l u d e s ) e x a m p l e . c p p − o e x a m p l e (python3 -m pybind11 --includes) example.cpp -o example (python3mpybind11includes)example.cppoexample(python3-config --extension-suffix)

  • c++:调用 C++ 编译器。
  • -O3:这是编译器的优化选项,-O3 代表进行高级优化。
  • -Wall:开启所有警告消息,帮助开发者发现潜在的问题。
  • -shared:生成动态链接库(shared library,或称为动态库)。
  • -std=c++11:使用 C++11 标准进行编译。
  • -fPIC:生成位置无关代码(Position Independent Code),这对于动态链接库是必需的。
  • $(python3 -m pybind11 --includes):这部分命令用于自动获取 pybind11 的头文件路径,以及 Python 的头文件路径。这是为了让编译器知道 pybind11 和 Python 头文件的位置。$(...) 是 Bash 中的命令替换,意味着先执行括号内的命令,然后将输出替换到当前位置。
  • example.cpp:你的源文件,包含了要绑定的 C++ 代码。
  • -o example$(python3-config --extension-suffix):指定输出文件的名称。$(python3-config --extension-suffix) 用于获取 Python 扩展模块的文件扩展名,确保生成的动态库与当前 Python 版本兼容。

注意

  • 确保在编译命令中使用正确的 Python 版本和 pybind11 路径。
  • 如果你的项目较大,考虑使用 CMake 来管理构建过程。pybind11 提供了支持 CMake 的示例和工具。

通过遵循这些步骤,你可以在 CentOS 7 上使用 pybind11 构建 C++ 的动态库,并在 Python 中调用它。

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

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

相关文章

Python - 构建多语言情感分析应用

在开发使用 Flask 构建的 Web 应用时,有时需要处理不同语言的情感分析。这个示例将展示如何同时处理英文和中文文本的情感分析,并使用 TextBlob 和 SnowNLP 这两个库实现。 英文情感分析 首先,我们有一个名为 __init__.py 的 Flask 应用处理英文情感分析。它接收 POST 请求…

画出TCP三次握手和四次挥手的示意图,并且总结TCP和UDP的区别

三次握手 第一次握手&#xff1a;客户端发送SYN包&#xff08;SYN1, seq0&#xff09;给服务器&#xff0c;并进入SYN_SENT状态&#xff0c;等待服务器返回确认包。第二次握手&#xff1a;服务器接收到SYN包&#xff0c;确认客户端的SYN&#xff0c;发送ACK包&#xff08;ACK1 …

在虚拟机上搭建CentOS环境并配置静态IP

在虚拟机上搭建CentOS环境并配置静态IP 在进行Linux系统的学习和实践时&#xff0c;搭建一个本地的CentOS环境是一个非常好的方式。本文将介绍如何使用虚拟机&#xff08;VM&#xff09;搭建CentOS环境&#xff0c;并配置静态IP&#xff0c;以便更好地进行网络管理和测试。 步…

项目学习记录

项目开发 创建项目环境配置关联git新增模块项目启动打印地址日志使用httpclient进行idea内部控制台测试使用AOP拦截器打印日志 创建项目 创建一个空项目&#xff0c;并勾选下面选项 然后进入pom.xml中修改项目配置 根据这个链接选则&#xff0c;修改项目的支持版本 链接&#…

TCP和UDP相关问题(重点)——7.TCP的流量控制怎么实现的?

流量控制就是在双方通信时&#xff0c;发送方的速率和接收方的速率不一定是相等的&#xff0c;如果发送方发送的太快&#xff0c;接收方就只能把数据先放到接收缓冲区中&#xff0c;如果缓冲区都满了&#xff0c;那么处理不过来就只能丢弃&#xff0c;所以需要控制发送方的速率…

供应链|Managemeng Science 论文解读:数据驱动下联合定价和库存控制的近似方法 (一)

编者按 本次解读的文章发表于 Management Science&#xff0c;原文信息&#xff1a;Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在数…

精通Python爬虫:掌握日志配置

源码分享 https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2 在开发Python爬虫时&#xff0c;日志记录是一个不可或缺的特性&#xff0c;它帮助我们捕捉运行时信息、调试代码和监控爬虫的健康状况。合理地配置日志系统是提高爬虫可维护性的关键。本篇技术博客将详细介绍…

测试管理_利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述&#xff0c;直接上代码文件。 另文章基础参考博文&#xff1a;参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

闭区间上连续函数的性质【高数笔记】

1. 分几个性质 2. 每个性质的注意事项是什么 3. 每个性质适用什么类型的题型 4. 注意最值定理和正弦函数的不同 5. 做题步骤是什么

Web前端框架-Vue(初识)

文章目录 web前端三大主流框架**1.Angular****2.React****3.Vue**什么是Vue.js 为什么要学习流行框架框架和库和插件的区别一.简介指令v-cloakv-textv-htmlv-pre**v-once**v-onv-on事件函数中传入参数事件修饰符双向数据绑定v-model 按键修饰符自定义按键修饰符别名v-bind(属性…

Swift 使用 Combine 进行开发 从入门到精通七

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

DMA直接内存访问,STM32实现高速数据传输使用配置

1、DMA运用场景 随着智能化、信息化的不断推进&#xff0c;嵌入式设备的数据处理量也呈现指数级增加&#xff0c;因此对于巨大的数据量处理的情况时&#xff0c;必须采取其它的方式去替CPU减负&#xff0c;以保证嵌入式设备性能。例如SD卡存储器和音视频、网络高速通信等其它情…

IPMI命令

AMI BMC IPMI命令 sysadmin superuser 命令基本格式 [前缀] -I lanplus ipmitool -H 127.0.0.1 -U admin -P admin ipmitool -H 127.0.0.1 -U admin -P admin raw 0x06 0x52 0x07 0xa0 0x10 0x00 0x00 ipmitool -H 127.0.0.1 -U admin -P admin raw 0x06 0x52 0x07 0xa0 0x00…

排序算法的时间复杂度存在下界问题

对于几种常用的排序算法&#xff0c;无论是归并排序、快速排序、以及更加常见的冒泡排序等&#xff0c;这些排序算法的时间复杂度都是大于等于O(n*lg(n))的&#xff0c;而这些排序算法存在一个共同的行为&#xff0c;那就是这些算法在对元素进行排序的时候&#xff0c;都会进行…

Visual Studio 2010+C#实现信源编码

1. 要求 本文设计了一套界面系统&#xff0c;该系统能够实现以下功能&#xff1a; 克劳夫特不等式的计算&#xff0c;并且能够根据计算结果给出相应的信息。可通过用户输入的初始条件然后给出哈夫曼编码以及LZ编码&#xff0c;结果均通过对话框来显示哈夫曼编码结果包含相应的…

2024.1.31力扣每日一题——找出不同元素数目差数组

2024.1.31 题目来源我的题解方法一 哈希表前后缀 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2670 我的题解 方法一 哈希表前后缀 从左到右计算前缀数组pre[i]表示nums[0,i]的不同元素个数&#xff1b; 从右到左计算后缀suff[i]表示nums(i,nums.length]的不同元素个…

Python小白:Python 编辑器那么多种,到底怎么选!!

前言 我在刚刚接触编程的时候很纠结于这个问题&#xff0c;因为我想找一个功能强大&#xff0c;免费&#xff0c;可多平台&#xff0c;支持多种语言的编辑器&#xff0c;所以我特意花费了一些时间对 Python 的编辑器进行了调研&#xff0c;我最终选择了 VScode 作为我的首选编…

深入挖掘AI应用场景的存储架构

深入挖掘AI应用场景的存储架构专题&#xff0c;需要从多个维度进行详细解读和分析。以下是一种可能的研究路径&#xff1a; 理解AI应用需求 数据类型与规模&#xff1a;AI应用通常涉及大量数据处理&#xff0c;包括结构化、非结构化和半结构化数据&#xff0c;且数据量呈现指数…

Redis 基本认识

文章目录 Redis八个特性Redis应用场景Redis应用缺陷Redis使用流程 Redis八个特性 速度快 原因: ① 单线程&#xff0c;避免了多线程竞争(如加锁/解锁)的时间开销 ② redis的数据存放在内存中 ③ 使用C语言编写&#xff0c;C语言更方便操做硬件 ④ Redis 源码优秀 利用键值对存…

【SpringBoot】JWT令牌

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 什么是JWT JWT简称JSON Web Token&#xff0c;也就是通过JSON形式作为Web应用的令牌&#xff0c;用于各方面之间安全的将信息作为JSON对象传输…