下载最新的caffe源码,执行$(CAFFE_ROOT)/script/build_win.cmd。 在编译好caffe 后,引入本身的工程中,稍有不注意的地方就会出现各类烦心问题。这里作一个归类
(1)boost库问题
(2)预约义宏
(3)未知的Layer 类型c++
>>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是用于动态编译的。windows
那么问题是,明明本身在“连接器”中的“输入”填写的是不带“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”的问题得以解决!!ui
>>预约义宏
以上添加的关于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"
在本身的工程中添加上述的宏这时编译基本能够所有经过了。google
>>未知的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的文件,内容以下:spa
#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);.net
以上这三个问题是移植caffe.lib到本身工程的过程当中遇到的问题。code