当前位置: 首页 > article >正文

在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.kler.cn/news/233005.html

相关文章:

  • Rust-AI todo list 开发体验
  • 第十七篇【传奇开心果系列】Python的OpenCV库技术点案例示例:自适应阈值二值化处理图像提取文字
  • Matlab绘图经典代码大全:条形图、极坐标图、玫瑰图、填充图、饼状图、三维网格云图、等高线图、透视图、消隐图、投影图、三维曲线图、函数图、彗星图
  • C#面:什么是Code-Behind技术
  • HiveSQL——共同使用ip的用户检测问题【自关联问题】
  • 【计算机网络基础篇】学习笔记系列之二《游览器输入URL后发生了什么?》
  • 语义分割任务的准确率计算:基于PyTorch实现
  • vscode +git +gitee 文件管理
  • archlinux 使用 electron-ssr 代理 socks5
  • mybatis-plus的批量修改源码遇到的问题
  • Lua metatable metamethod
  • 网络游戏租用价格表,一年、1个月收费明细表
  • 按键扫描16Hz-单片机通用模板
  • Docker-CE 国内源国内镜像
  • div 2_div 3_ div 4_刷题刷题刷题
  • Linux线程 分离和同步与互斥 条件变量
  • 华为 Huawei 交换机 黑洞MAC地址的作用和配置示例
  • JMM(Java内存模型)
  • 系统架构24 - 软件架构设计(3)
  • 已解决org.springframework.aop.AopInvocationException异常的正确解决方法,亲测有效!!!
  • Python中的嵌套字典访问与操作详解
  • VR全景技术可以应用在哪些行业,VR全景技术有哪些优势
  • 无心剑汉英双语诗《龙年大吉》
  • Docker概述
  • 《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)
  • LabVIEW热电偶自动校准系统
  • FastDFS安装并整合Openresty
  • 【SpringBoot】JWT令牌
  • 【正式】今年第一篇CSDN(纯技术教学)
  • python29-Python的运算符之in运算符