caffe初试,一happynear的caffe-windows版本的配置及遇到的问题

之前已经配置过一次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.hcaffe.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,结果真的可以正常开始训练了。真是被自己的智慧所折服。- -|||

以上。