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_<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文件就可以独立调用了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容