之前已經配置過一次caffe環境了:
Caffe初試(一)win7_64bit+VS2013+Opencv2.4.10+CUDA6.5配置Caffe環境
但其中也提到,編譯時,用到了cuda6.5,但是實際訓練時,使用GPU訓練,又會出現問題。所以強迫症使然,我決定另外配置一個cpu_only的版本,編譯時,不使用cuda。
於是網上查了查,很多小伙伴都是使用happynear配置的caffe-windows版本,並參照其博客中的步驟進行編譯使用的:
如何快糙猛地在Windows下編譯CAFFE並使用其matlab和python接口
按照博客中的方法,自己要做的事情就變得很少很少了,主要有:
1、雙擊./src/caffe/proto/extract_proto.bat
批處理文件來生成caffe.pb.h
和caffe.pb.cc
兩個c++文件,和caffe_pb2.py
這個Python使用的文件。
2、打開./build_cpu_only/MainBuilder.sln ,點擊編譯按鈕;
原來以為只需靜靜等待,即可生成caffe.exe。但沒想到,還是出現了問題,費了好大的勁,最終才得以解決。
問題一:編譯時,出現如下錯誤:
錯誤 621 error LNK2001: 無法解析的外部符號 "__declspec(dllimport) void __cdecl google::ShowUsageWithFlagsRestrict(char const *,char const *)" (__imp_?ShowUsageWithFlagsRestrict@google@@YAXPEBD0@Z) F:\caffe-windows-master\build_cpu_only\MSVC\caffe.obj caffe
錯誤 622 error LNK2001: 無法解析的外部符號 "__declspec(dllimport) void __cdecl google::SetUsageMessage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_?SetUsageMessage@google@@YAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) F:\caffe-windows-master\build_cpu_only\MSVC\caffe.obj caffe
錯誤 623 error LNK2001: 無法解析的外部符號 "__declspec(dllimport) public: __cdecl google::FlagRegisterer::FlagRegisterer(char const *,char const *,char const *,char const *,void *,void *)" (__imp_??0FlagRegisterer@google@@QEAA@PEBD000PEAX1@Z) F:\caffe-windows-master\build_cpu_only\MSVC\caffe.obj caffe
錯誤 624 error LNK2001: 無法解析的外部符號 "__declspec(dllimport) void __cdecl google::SetVersionString(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_?SetVersionString@google@@YAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) F:\caffe-windows-master\build_cpu_only\MSVC\caffe.obj caffe
錯誤 625 error LNK2001: 無法解析的外部符號 "__declspec(dllimport) unsigned int __cdecl google::ParseCommandLineFlags(int *,char * * *,bool)" (__imp_?ParseCommandLineFlags@google@@YAIPEAHPEAPEAPEAD_N@Z) F:\caffe-windows-master\build_cpu_only\MSVC\common.obj caffe
錯誤 626 error LNK1120: 5 個無法解析的外部命令 F:\caffe-windows-master\bin\caffe.exe caffe
出現的問題是:程序運行時調用了ShowUsageWithFlagsRestrict、SetUsageMessage等這些個函數,但編譯器找不到這些函數定義的位置,即出現“無法解析的外部符號”,這就是缺少依賴庫時常出現的error。究其原因是happynear在caffe的配置環境中,沒有添加libgflags.lib庫。這是一個Google開源的一個庫,具體用途我也不知道。
所以只需:打開各工程屬性頁,在 鏈接器-》輸入-》附加依賴項 中添加 “libgflags.lib” 即可。
問題二:運行run_mnist.bat,嘗試使用caffe訓練mnist手寫字體庫模型時出現如下錯誤:
** On entry to SGEMM parameter number 3 had an illegal value
** On entry to SGEMM parameter number 3 had an illegal value
** On entry to SGEMM parameter number 3 had an illegal value
** On entry to SGEMM parameter number 3 had an illegal value
這不是一個常見的錯誤,所以上網查了很久也沒找到解決的方法。后來只有自己亂試了,結果在配置環境變量時發現,我上一次使用
Caffe初試(一)win7_64bit+VS2013+Opencv2.4.10+CUDA6.5配置Caffe環境
配置時,發現當時第三方庫下的bin路徑還存在(我的是F:\caffe\3rdparty\bin;)而這一次的配置,環境變量是放在F:\caffe\3rdparty\bin;之后的,會不會是由於F:\caffe\3rdparty\bin;的存在,使得該版本生成的caffe.exe在訓練時出錯,因為caffe.exe在運行時,是會從環境變量中找尋找需要的動態庫進行鏈接才能順利執行的。或許是因為F:\caffe\3rdparty\bin;的存在,使得該版本下的caffe.exe在運行時,先從F:\caffe\3rdparty\bin;中取動態庫進行鏈接,而可能兩個版本在配置時所用動態庫有差異,不能共用,所以才導致該版本的caffe.exe在訓練時,出現如上錯誤?
帶着疑問,我將F:\caffe\3rdparty\bin;從環境變量中刪去,並且從任務管理器中結束了explorer.exe,再重新新建任務explorer.exe(即使環境變量生效!!!)
然后再運行run_mnist.bat,結果真的可以正常開始訓練了。真是被自己的智慧所折服。- -|||
以上。