pybind11-Installation

Introduction

pybind11 是一个轻量级的纯头文件库,可以在 Python 中公开 C++ 类型,反之亦然,主要用于创建现有 C++ 代码的 Python 绑定。它的目标和语法与 David Abrahams 的 Boost.Python 库相似:通过使用编译时自省推断类型信息,最大限度地减少传统扩展模块中的模板代码。

pybind11 is a lightweight header-only library that exposes C++ types in Python and vice versa, mainly to create Python bindings of existing C++ code. Its goals and syntax are similar to the excellent Boost.Python library by David Abrahams: to minimize boilerplate code in traditional extension modules by inferring type information using compile-time introspection.

Git Clone Source Code

首先在你想下载的文件夹下(我的是 D:\) git clone pybind11 的源码后进行构建,并运行测试用例

1
2
3
4
5
6
git clone https://github.com/pybind/pybind11.git
cd pybind11
mkdir build
cd build
cmake ..
cmake --build . --config Release --target check

如果没有报错则安装成功

Visual Studio Project Properties Configuration

创建一个 Visual Studio 的一个空项目,并新建一个 .cpp 文件,以一个简单的加法程序作为测试

1
2
3
4
5
6
7
8
9
10
#include"pybind11/pybind11.h"

int add(int i, int j) {
return i + j;
}

PYBIND11_MODULE(example, m) {
m.doc() = "TestPybind plugin";
m.def("add", &add, "A function that adds two integers");
}

接着我们打开项目的 Property Pages (属性页),修改 Configuration Type 为 Dynamic Library(.dll)

Configuration Type

这里需要注意我们要使上一行 Target Name (默认和 ProjectName 相等) 和 PYBIND11_MODULE 的模块名一致,否则后面从 python import 时候会报错。

然后在 Advanced 中修改后缀名称为 .pyd

Target File Extension

接着我们需要在 C/C++ 的 General 选项卡中添加 python 和 pybind11 的包含目录,我是通过 miniconda 安装的 python,因此 python.h 所在的包含目录位置为 C:\Users\$(UserName)\miniconda3\include. pybind11 的包含目录在刚才 git clone 源码的文件夹下 D:\pybind11\include

Additional Include Directories

Add python & pybind11 include Directories

然后在 Linker 的 General 选项卡中添加 python 的库目录 (前文已经说过 pybind11 是一个 header—only 库) C:\Users\$(UserName)\miniconda3\libs

Additional Library Directories

Add python Library Directories

右键项目进行 build,成功后会在项目目录下的 x64\Debug 文件夹下 生成 .pyd 文件,可以在命令行中进行测试。

Test Module


pybind11-Installation
https://darkenstar.github.io/2024/12/02/pybind11-Installation/
Author
ANNIHILATE_RAY
Posted on
December 2, 2024
Licensed under