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

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

void face_handler(py::module& m) {
    py::class_(m, "RFInfer")
        .def(py::init())
        .def("__call__", &RFInfer::operator())
        .def("init_rf", &RFInfer::init_RF)
        .def("destroy_rf", &RFInfer::destroy_RF);
    py::class_(m, "FaceInfoPY")
        .def_readwrite("bbox", &FaceInfoPY::bbox)
        .def_readwrite("landmark", &FaceInfoPY::landmark)
        .def_readwrite("score", &FaceInfoPY::score);
    py::class_(m, "AFInfer")
        .def(py::init())
        .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生成python接口)