学习pybind11(1):编译安装

[TOC]

我对pybind11一点儿也不了解:虽然我知道Caffe中用Boost.Python来创建PyCaffe,也就是Caffe的Python接口;我也看到PyTorch基于pybind11做Python接口;但是我没有写过一行基于boost.python或pybind11做C/C++和Python接驳的代码。

鉴于Boost的编译安装真的太傲娇(好端端的CMake不用,非要邪门歪道搞一个难用而且文档也不更新的j2,bjam),直接上手看PyBind11。这一篇试着编译安装pybind11。

环境

系统:MacOSX
python: miniconda3, python3.7.1
cmake: 3.15.4
boost: conda install boost, 1.67,包含了py-boost
pip: pip install pytest

执行构建

git clone https://github.com/pybind/pybind11
cd pybind11
mkdir build
cd build
cmake .. -DBOOST_INCLUDEDIR=/Users/chris/soft/miniconda3/include
make -j3

输出:

-- Building tests with Eigen v3.3.7
-- Found Boost: /Users/chris/soft/miniconda3/include (found suitable version "1.67.0", minimum required is "1.56")
-- Catch not detected. Interpreter tests will be skipped. Install Catch headers manually or use cmake -DDOWNLOAD_CATCH=1 to fetch them automatically.
-- pybind11 v2.4.dev4
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/chris/work/pybind11/build

执行安装,还好它是header-only方式的,装到了/usr/local/include/pybind11,并且提供了cmake的配置文件(看来作者cmake水平还不错,鼓励一下:-) )

学习pybind11(1):编译安装_第1张图片
image.png

构建都执行了什么

迅速的过一遍CMakeLists.txt:

31 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/tools")

作者把tools目录中放了各种cmake的find脚本,其实以往看到的项目都是放在${CMAKE_SOURCE_DIR}/cmake/modules目录下的:


学习pybind11(1):编译安装_第2张图片
image.png

其中Catch是C++单元测试框架(也是header-only的),2.x版本需要C++11,1.x系列不需要C++11,应该说比google的gtest要轻量一些。Eigen是矩阵计算相关的(没用过,不了解)。pybind11Tools.cmake则是对cmake稍作封装,把重复用到的语句封装为cmake的函数。

 70 string(REPLACE "include/" "${CMAKE_CURRENT_SOURCE_DIR}/include/"
 71        PYBIND11_HEADERS "${PYBIND11_HEADERS}")

这里是做批量的文件路径前缀替换,比手动一个个的去添加方便多了。还是要学习一个string(REPLACE)操作哇。

98   add_library(pybind11 INTERFACE)

105   add_library(module INTERFACE)

117   add_library(embed INTERFACE)

这几个target虽然是库,但是是INTERFACE,实际不会创建库;在安装阶段,它们3个“伪target”被依赖:

149     install(TARGETS pybind11 module embed
150             EXPORT "${PYBIND11_EXPORT_NAME}")

这样看完一遍,没有什么实质收获,记不住细节也没有用来做出东西。下一篇按官方文档例子弄一个python module出来,也就是pybind11的hello world。

你可能感兴趣的:(学习pybind11(1):编译安装)