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文件就可以独立调用了
网友评论