c++工程中使用caffe.lib常見的錯誤及解決方法

下載最新的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

相關文章
相關標籤/搜索