博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++工程中使用caffe.lib常见的错误及解决方法
阅读量:6805 次
发布时间:2019-06-26

本文共 2810 字,大约阅读时间需要 9 分钟。

hot3.png

下载最新的caffe源码,执行$(CAFFE_ROOT)/script/build_win.cmd。 在编译好caffe 后,引入自己的工程中,稍有不注意的地方就会出现各种烦心问题。这里做一个归类

(1)boost库问题
(2)预定义宏
(3)未知的Layer 类型

>>boost库问题

参照原caffe-windows的classification工程配置好caffe及caffe所依赖的第三方库(glog,lmdb,opencv,....)的include,lib目录,在"链接器"->“输入”同样写上依赖的.lib文件。以上配置完后,理论上是可以通过编译了,但是,这个时候出现了:无法打开“libboost_date_time-vc-140-mt-gd-1_59.lib”,搜索了很多的结果,答案都是说重新编译boost,我自己也重新编译了还是不行,也有说把"项目属性"->“C++”->"代码生成"的“/MDd” 改成“/MTd”,无奈还是无法解决问题。无意中注意到自己重新编译的boost中有两个文件名很相似的.lib文件libboost_date_time-vc-140-mt-gd-1_59.lib和boost_date_time-vc-140-mt-gd-1_59.lib,又对比了$(CAFFE_ROOT)/script/build/libraries/lib中关于boost的.lib文件只提供了一个。于是,对比了一下这两个文件的异同。原来libboost_date_time-vc-140-mt-gd-1_59.lib 是用于静态编译的,而boost_date_time-vc-140-mt-gd-1_59.lib是用于动态编译的。

那么问题是,明明自己在“链接器”中的“输入”填写的是不带“lib”的库,为什么编译的时候会提示“无法打开“libboost_date_time-vc-140-mt-gd-1_59.lib””? 经过千辛万苦终于在 找到一点蛛丝马迹。大致意思是需要在vs 中定义一个宏 BOOST_ALL_NO_LIB告诉编译器,在编译的时候自动去检索存在的库。那么再对比一个原caffe-windows的classification工程是怎么写的。果然,在”工程属性“->"c++"->”预处理器“发现了关于boost的宏

BOOST_ALL_NO_LIB
BOOST_NO_CXX11_TEMPLATE_ALIASES
接着也同样给自己的工程添加这两个宏,再执行编译。关于提示无法打开“libboost_date_time-vc-140-mt-gd-1_59.lib”的问题得以解决!!

>>预定义宏

以上添加的关于boost的宏已经得到解决,但是如果只加上面的两个宏,编译还是有其他的错误,一般是关于google::glog的一些符号无法解析。参照刚才的方法我们索性把classification中定义的宏全部copy过去。即 CAFFE_VERSION=1.0.0-rc3
BOOST_ALL_NO_LIB
BOOST_NO_CXX11_TEMPLATE_ALIASES
USE_LMDB
USE_LEVELDB
USE_CUDNN
USE_OPENCV
WITH_PYTHON_LAYER
CMAKE_WINDOWS_BUILD
GLOG_NO_ABBREVIATED_SEVERITIES
GOOGLE_GLOG_DLL_DECL=__declspec(dllimport)
GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS=__declspec(dllimport)
H5_BUILT_AS_DYNAMIC_LIB=1
CMAKE_INTDIR="Debug"
在自己的工程中添加上述的宏这时编译基本可以全部通过了。

>>未知的Layer 类型(Unknown Layer Type)

编译通过了之后就可以执行了,这里使用的是bvlc_googlenet的模型。在初始化Net后触发了一个错误,程序直接挂了->”Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type“。提示居然不认识”InputLayer“了,这明显不可能,在源码中已经有相应实现了。这个问题的解决方案可以参考 做的主要是在自己工程添加一个myheader.hpp的文件,内容如下:

#include "caffe/common.hpp"#include "caffe/layers/input_layer.hpp"#include "caffe/layers/inner_product_layer.hpp"#include "caffe/layers/dropout_layer.hpp"#include "caffe/layers/conv_layer.hpp"#include "caffe/layers/relu_layer.hpp"#include "caffe/layers/pooling_layer.hpp"#include "caffe/layers/lrn_layer.hpp"#include "caffe/layers/softmax_layer.hpp"#include "caffe/layers/concat_layer.hpp"namespace caffe{	extern INSTANTIATE_CLASS(InputLayer);	extern INSTANTIATE_CLASS(InnerProductLayer);	extern INSTANTIATE_CLASS(DropoutLayer);	extern INSTANTIATE_CLASS(ConvolutionLayer);	extern INSTANTIATE_CLASS(ReLULayer);	extern INSTANTIATE_CLASS(PoolingLayer);	extern INSTANTIATE_CLASS(LRNLayer);	extern INSTANTIATE_CLASS(SoftmaxLayer);	extern INSTANTIATE_CLASS(ConcatLayer);}

具体每个人可能不一样,哪一个Layer没有注册就添加一个REGISTER_LAYER_CLASS(XXXX);重复就删掉;哪一个没有实例化,就加一个extern INSTANTIATE_CLASS(X'X'XX);

以上这三个问题是移植caffe.lib到自己工程的过程中遇到的问题。

转载于:https://my.oschina.net/u/733649/blog/828955

你可能感兴趣的文章
《第一行代码》1day~了解全貌
查看>>
复习javaIO 之File类
查看>>
How to install snmpwalk snmpget on CentOS 6.4 6.3 5.9 Redhat RHEL Fedora
查看>>
最小生成树
查看>>
Mybatis中配置Mapper的方法
查看>>
Java基础学习总结(19)——Java环境变量配置
查看>>
Mvc5+Entity Framework6 之二----在MVC中用Entity Framework实现基本的CRUD
查看>>
我的友情链接
查看>>
大型网站技术架构(四)网站的高性能架构
查看>>
linux系统修改SSH最大连接数,修改nofile,nproc参数方法
查看>>
Hadoop-2.5.2集群安装配置详解
查看>>
解决报表网页版转成excel时,首位0被清除的问题
查看>>
Mysql学习总结(3)——MySql语句大全:创建、授权、查询、修改等
查看>>
MyBatis学习总结(8)——Mybatis3.x与Spring4.x整合
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解...
查看>>
IIS 7.0 和 IIS 7.5 中的 HTTP 状态代码
查看>>
Dubbo学习总结(1)——Dubbo入门基础与实例讲解
查看>>
rsync搭建及管理
查看>>
STL:std::shared_ptr大致原理.
查看>>
高并发学习笔记(八)
查看>>