美文网首页
学习pybind11(5):C/C++代码有额外依赖库

学习pybind11(5):C/C++代码有额外依赖库

作者: BetterCV | 来源:发表于2020-06-02 20:26 被阅读0次

    先前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的模块绑定代码中显式编写,因为离开作用域之后自动调用析构函数。

    相关文章

      网友评论

          本文标题:学习pybind11(5):C/C++代码有额外依赖库

          本文链接:https://www.haomeiwen.com/subject/tjmpzhtx.html