美文网首页MNN实践
VS CMAKE链接MNN静态库,使用pybind11生成pyt

VS CMAKE链接MNN静态库,使用pybind11生成pyt

作者: qizhen816 | 来源:发表于2020-04-01 15:57 被阅读0次

    pybind11的使用教程已经有很多了,参考https://zhuanlan.zhihu.com/p/93299698
    ,建议使用vcpkg安装pybind11 pybind11:x64-windows-static等等库
    我的接口形式为

    void face_handler(py::module& m) {
        py::class_<RFInfer>(m, "RFInfer")
            .def(py::init<const std::string&>())
            .def("__call__", &RFInfer::operator())
            .def("init_rf", &RFInfer::init_RF)
            .def("destroy_rf", &RFInfer::destroy_RF);
        py::class_<FaceInfoPY>(m, "FaceInfoPY")
            .def_readwrite("bbox", &FaceInfoPY::bbox)
            .def_readwrite("landmark", &FaceInfoPY::landmark)
            .def_readwrite("score", &FaceInfoPY::score);
        py::class_<AFInfer>(m, "AFInfer")
            .def(py::init<const std::string&>())
            .def("__call__", &AFInfer::operator())
            .def("init_af", &AFInfer::init_AF)
            .def("destroy_af", &AFInfer::destroy_AF);
    }
    
    PYBIND11_MODULE(facemnn, m) {
        m.doc() = "facemnn: A face detector created using pybind11";
        face_handler(m);
    };
    

    MNN静态库编译参考官网https://www.yuque.com/mnn/cn/cvrt_windows

    准备工作做好之后,编译pyd接口的CMakeLists,使用动态库的话很方便,但是python调用需要加很多dll的地址进去,链接静态库很方便,但是编译会有很多问题。

    首先在VS中打开CMakeSettings.json,按照你的需要设置各种x64/x86 debug/release,然后修改几个FLAGS:


    C
    CXX

    这里FLAGS的第一项参数要将/DT修改为/MT,二者分别对应了动态和静态链接你的库文件。
    如果不修改的话,build链接会出现

    “MT_StaticRelease”不匹配值“MD_DynamicRelease”
    

    然后在CMakeLists.txt中,pybind11_add_module之后,链接MNN之前加一句

    SET_TARGET_PROPERTIES(你的项目 PROPERTIES LINK_FLAGS_RELEASE "/WHOLEARCHIVE:MNN")
    

    这一句类似linux下的-Wl,--whole-archive
    之后生成的pyd文件就可以独立调用了

    相关文章

      网友评论

        本文标题:VS CMAKE链接MNN静态库,使用pybind11生成pyt

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