在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 (python3−mpybind11−−includes)example.cpp−oexample(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 中调用它。