caffe(官方) + vs2015 dll封装 + mfc工程 调用

此片文章在编译成功caffe的基础上进行。前期准备可以参考链接:win10 + caffe + vs2015

此处有坑:cmake编译出现错误:Could NOT find Protobuf,是由于protobuf3.0版本以后不向下兼容造成的,解决方案:在caffe\CMakeLists.txt中加入:

caffe_option(protobuf_MODULE_COMPATIBLE "Make the protobuf-config.cmake compatible with the module mode" ON)

开启protobuf的兼容性,即可解决。

更详细内容参考大神博文:https://blog.csdn.net/10km/article/details/75145409

c++工程调用caffemodel

将linux下跑的深度学习结果移植到c++工程里,是我最近最头疼的一件事。

以前也是用过不少c++的外部库,可貌似每次都是稀里糊涂带着一点侥幸的心里安装好的,所以这次遇到caffe这个接口众多外部依赖库众多的框架之后,我还真是乱了阵脚。随便百度一下,相关资料多的耀眼,细细甄别来,对我帮助最大的应该是这一篇博客:工程配置(三) vs2015+Caffe配置自己的工程

但他写的比较简洁,我花了很大的力气才参悟。所以决定记录一下这次配置工程的方法。

工程配置方法

caffe版本: https://github.com/BVLC/caffe/tree/windows

编译器:vs2015

caffe项目:windows 控制台dll  

主工程: MFC工程

设计思路是为了以后可以跨编译器调用,将caffe库编译在dll中。特意写了external-C接口,据说.def文件不支持跨平台调用。这边可以参考我的前一篇文章:DLL函数导出

caffe的配置主要根据编译caffe时的配置完成:在官方版本的caffe中有一个classification.cpp的例程

这个例程作为一个项目编译后会生成一个exe文件,只要参考它的属性设置在来配置我的工程就可以了。

这里的属性设置主要修改:

Configuration Properties -> C/C++ -> general -> Additional Include Directories  引用路径

Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions  预编译宏

Linker -> General -> Additional Libirary Directories  附加依赖库路径

Linker -> Input ->Additional Dependencies   附加依赖库

于是我照葫芦画瓢的把,在预编译头不开启的情况下可以成功,但一旦开启预编译头,就会有上百个错误。

原因是他给出的预处理器中少了两个宏: NO_STRICT  和  NOMINMAX

extern ::google::protobuf::internal::ExplicitlyConstructed<SolverState> SolverState_default_instance_;

Error	C3254	'caffe::FillerParameter': class contains explicit override 'internal_default_instance' 
but does not derive from an interface that contains the function declaration	

对于错误 C2059:

Error	C2059	syntax error: 'constant'	

解决方法为:

加入NO_STRICT到预处理器。原因是命名冲突,添加预定义就好了。

对于其他错误,类似于C2071,C2838,C3254等,加入 NOMINMAX 预处理器即可。

总结一下:

虽然caffe有众多依赖库,可搞清楚这些也不难,打开编译caffe 的工程,参照里面的工程属性,将其中引用的头文件、依赖库和动态库统一copy到一个文件夹下,再在自己的工程中一一引用,就OK了~

猜你喜欢

转载自blog.csdn.net/cu_is_me/article/details/82221605
今日推荐