【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试
标签:【神经网络与深度学习】 【CUDA开发】
主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是win32,死活找不到x64的库,对是gnuwin32,没有找到gnuwin64,也是哭了,于是想着是不是能够将Caffe按照win32的配置进行重新编译一番。结果可想而知,遇到了一堆的问题,很伤心,最后也没有解决,不,最后是完全将cuDNN和CUDA全部去掉后才成功的,因为cuDNN没有找到所谓的Win32的库,而CUDA7.5中Win32的库不全,于是编译的时候爆出找不到cublas.lib的错误,或者打不开的错误。真的很奇怪,CUDA和cuDNN居然对Win32的支持这么弱!没想到!
<1> 将visual studio 2013的增加Win32的配置
新建配置Win32,然后全部改为Win32,尝试编译一下,爆出一大堆错误;
<2> 首先得配置工程文件,模仿.vcxproj工程文件中的x64的配置方式,对Win32进行配置
通常Release版本和Debug版本都已经按照platform宏可以自动识别,但是x64和win32好像没有。配置完毕后运行一下,看看少了哪些库文件。因为刚开始配置的时候大部分下载的NuGet包肯定是支持x64的库的,但是Win32的就不一定有了。通常观察,OpenCV和glag两个里面没有Win32的库,所以,尝试着在Win32状态下重新卸载NuGet包,然后再 安装,看看会不会将对应的Win32的库下载下来,结果是可以的!
<3> 关于cuDNN的32bit库
通过在NVIDA官网上寻找cudnn的下载,始终没有找到Win32版本的,不管是cuDNNv4,v5等都只有x64的库,于是只能从工程配置中将cuDNN设置为false了,不使用cudnn。
<4> 关于CUDA的32bit库
刚开始去到cuda toolkit中找到了win32的库,但是相比x64的库,少了许多,当时就在网上查看相关的说明,说是cuda对64位的支持要远多于32bit的支持,但当时还是硬着头皮试着设置工程为使用cuda,结果爆出了一大堆关于cublas.lib等库找不到、打不开的错误,进入toolkit的win32库中查看,确实没有这个库,而在x64的库中却有。这一下就坚定了我的决心,编译32bit的Caffe,不能使用cuda了,于是将cuda的支持去掉,重新编译,在排除了几个问题之后就成功的生成了libcaffe,然后用classification进行了测试,可以完成预测分类。当然这个时候还只是在release版本下。
<5> win32-debug版本下的编译问题
切换到win32-debug下进行编译,出现了让我十分头疼的问题,就是leveldb库出现问题了,就是在链接的时候,有些函数找不到,我进入到leveldb的目录下查看发现是有Win32/debug版本的,可是好像链接器并没有识别这家伙似的。
13>db.obj : error LNK2019: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall leveldb::Status::ToString(void)const " (?ToString@Status@leveldb@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ),该符号在函数 "public: virtual void __thiscall caffe::db::LevelDBTransaction::Commit(void)" (?Commit@LevelDBTransaction@db@caffe@@UAEXXZ) 中被引用
13>db_leveldb.obj : error LNK2001: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall leveldb::Status::ToString(void)const " (?ToString@Status@leveldb@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
13>db.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall leveldb::WriteBatch::WriteBatch(void)" (??0WriteBatch@leveldb@@QAE@XZ),该符号在函数 "public: __thiscall caffe::db::LevelDBTransaction::LevelDBTransaction(class leveldb::DB *)" (??0LevelDBTransaction@db@caffe@@QAE@PAVDB@leveldb@@@Z) 中被引用
13>db.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall leveldb::WriteBatch::~WriteBatch(void)" (??1WriteBatch@leveldb@@QAE@XZ),该符号在函数 __unwindfunclet$??0LevelDBTransaction@db@caffe@@QAE@PAVDB@leveldb@@@Z$1 中被引用
13>db.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall leveldb::WriteBatch::Put(class leveldb::Slice const &,class leveldb::Slice const &)" (?Put@WriteBatch@leveldb@@QAEXABVSlice@2@0@Z),该符号在函数 "public: virtual void __thiscall caffe::db::LevelDBTransaction::Put(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?Put@LevelDBTransaction@db@caffe@@UAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) 中被引用
13>db_leveldb.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall leveldb::Options::Options(void)" (??0Options@leveldb@@QAE@XZ),该符号在函数 "public: virtual void __thiscall caffe::db::LevelDB::Open(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,enum caffe::db::Mode)" (?Open@LevelDB@db@caffe@@UAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@W4Mode@23@@Z) 中被引用
13>db_leveldb.obj : error LNK2019: 无法解析的外部符号 "public: static class leveldb::Status __cdecl leveldb::DB::Open(struct leveldb::Options const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class leveldb::DB * *)" (?Open@DB@leveldb@@SA?AVStatus@2@ABUOptions@2@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAPAV12@@Z),该符号在函数 "public: virtual void __thiscall caffe::db::LevelDB::Open(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,enum caffe::db::Mode)" (?Open@LevelDB@db@caffe@@UAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@W4Mode@23@@Z) 中被引用
尝试了好几种办法,仍然无法排除,想着就放弃了。其实生成了Release版本的之后在使用的时候已经可以了,只不过只能对应Release版本的配置,改成Debug版本就出现一堆编译问题:
libcaffe.lib(softmax_loss_layer.obj):-1: error: LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”(main.obj 中)
总之是调试版本与发行版本中的冲突,连编译都通不过!尼玛,还是算了,有一个版本就能用了,不要纠结完美实现了。
小结:
通过此次的Caffe各种环境下的编译,让我对x64、Win32以及Qt、比较新的Visual studio 2015中的各种配置的理解稍微有些提升,另外就是为了实现这些功能,我反复安装了一共3个版本的Qt,从Qt-win32-msvc2015,到Qt-x64-msvc2013,Qt-win32-msvc2013,然后visual studio安装了2013版本和2015版本,特别需要指出的CUDA的toolkit居然不支持visual studio 2015,所以为了配合我将版本回滚到2013,然后再对caffe进行配置就比较顺心了。
2016-9-18 11:37
张朋艺 pyZhangBIT2010@126.com