c++工程中使用caffe.lib常见的错误及解决方法
c++工程中使用caffe.lib常见的错误及解决方法
二胡艺 发表于1年前
c++工程中使用caffe.lib常见的错误及解决方法
  • 发表于 1年前
  • 阅读 196
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: c++工程中使用caffe.lib常见的错误及解决方法

下载最新的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””? 经过千辛万苦终于在http://stackoverflow.com/questions/16056461/linking-error-ambiguous-libboost-lib-vs-boost-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“了,这明显不可能,在源码中已经有相应实现了。这个问题的解决方案可以参考http://blog.csdn.net/fangjin_kl/article/details/50936952 做的主要是在自己工程添加一个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到自己工程的过程中遇到的问题。

标签: caffe Boost c++
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 42
码字总数 12555
×
二胡艺
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: