先前pybind11的样例工程中( 学习pybind11(2):Hello World例子 ),C/C++代码功能很简单,实现的是a+b的功能。
现在考虑"a+b"的功能升级:例如做图像上的ROI区域的crop操作,也就是CropImage。图像相关的操作,通常用OpenCV库。虽然OpenCV有Python接口,不过因为我们需要的CropImage操作,还会涉及到调用OpenCV以外的C/C++代码(或者库),例如虹软的FreeSDK人脸检测功能。因此还是有必要的做的。
具体做法其实很简单,只需要CMakeLists.txt中增加一句即可:
target_link_libraries(example PRIVATE ${OpenCV_LIBS})
其中example
是创建的target,而${OpenCV_LIBS}
是find_package(OpenCV)
找到后产生的可用变量。对于find_package()
用法不太熟悉的可以翻看我的cmake专栏文章:CMake实践
指定Pybind11对应的Python版本
在CMakeLists.txt中指定至少要满足的python版本:
set(PYBIND11_PYTHON_VERSION 3.6)
实测,我的当前环境为conda的base,是python3.7,则cmake时会找到并使用3.7。也就是说,你可以通过conda创建不同的虚拟环境来管理python版本,然后conda activate xxx来切换到这个环境,然后cmake就用这个版本的python了。
不过其实也可以手动指定PYTHON的可执行文件路径、库路径、头文件搜索路径,像OpenCV的cmake阶段就通过这种方式成功的选择了不同的python版本。
Pybind11封装class
把C++的结构体/类封装为Python中的类,Python11也可以做到。
简单的例子,不妨参考:https://www.jb51.net/article/181254.htm
稍微说一下,c++ class的析构函数不需要在pybind11的模块绑定代码中显式编写,因为离开作用域之后自动调用析构函数。
网友评论