Happynear Caffe + ECO + VisualStudio2015
这个是以前的ECO (https://github.com/nicewsyly/ECO) 在windows下的编译笔记,也许没啥大用,今天重新打开以前的代码时,同样的问题完全忘记当时怎么处理的了,还是好记性不如烂笔头!所以干脆弄到这里来。
因为是以前的,显得有点乱,不想再整理了, 时间有点长,不保证没错误 :-{
注意事项
No.1 visual studio 版本
Please use MicrosoftCaffe at this moment,
MicrosoftCaffe supports only visual studio 2013
Caffe(HappyNear) supports visual studio 2015
No.2 配置CaffeHappyNear supports visual studio 2015 libcaffe无法加载的问题: 在commonSettings.props中设置不使用cuda之后,保存,重新启动vs2015,重新加载,多来两次,就能加载成功,否则会一直报错:因为没有cuda8.0
<CpuOnlyBuild>true</CpuOnlyBuild>
<UseCuDNN>false</UseCuDNN>
<UseNCCL>false</UseNCCL>
<UseMKL>false</UseMKL>
<CudaVersion>8.0</CudaVersion>
<!-- NOTE: If Python support is enabled, PythonDir (below) needs to be
set to the root of your Python installation. If your Python installation
does not contain debug libraries, debug build will not work. -->
<PythonSupport>true</PythonSupport>
<!-- NOTE: If Matlab support is enabled, MatlabDir (below) needs to be
set to the root of your Matlab installation. -->
<MatlabSupport>false</MatlabSupport>
<MXNetSupport>false</MXNetSupport>
特别注意:这个
<CudaDependencies>cufft.lib</CudaDependencies>
要改成
<CudaDependencies></CudaDependencies>
否则
$(CudaDependencies)会报错找不到依赖cufft.lib,无法打开文件“python36_d.lib”
visual object tracking ECO-1 + visual studio 2015 编译成功
大体介绍
已经成功编译ECO-1 + visual studio 2015 !
原来作者提供了一些库的信息,不过我没有采用,原因是发现这样我的caffe和eco所使用的glog, gflags, boost等诸多库的版本都不相同,有很多报错的地方,也没时间去逐个检查各种冲突,所以干脆自己重新弄一下,使caffe和ECO所使用的库版本都相同,
本人所使用的目录如下
文件目录
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\include;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\build\include;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\Boost;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\GFlags\Include;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\GLog\include;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\Protobuf\include;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\OpenBLAS\include;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\OpenCV\include;
$(IncludePath)
库目录
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\Build\x64\Debug;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\Protobuf\lib;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\Boost\lib64-msvc-14.0;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\GFlags\Lib;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\GLog\lib;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\OpenBLAS\lib;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\OpenCV\x64\vc14\lib;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\LEVELDB\lib;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\LMDB\lib;
E:\ACaffeWin\Caffehappynear\caffe-windows-ms\windows\thirdparty\HDF5\lib;
$(LibraryPath)
原来作者的是这样的,和我的不同,供参考
F:\caffe-windows\build\lib\Release;
C:\Users\ws_zz\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\lib;
C:\Users\ws_zz\.caffe\dependencies\libraries_v140_x64_py27_1.1.0\libraries\x64\vc14\lib;
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64;
F:\opencv\build\x64\vc14\lib;$(LibraryPath)
注意有release和debug模式,在windows下我一般首先都会采用debug+VC调试器用来学习分析,在debug模式下,使用静态库lib文件(也就是说,下面这些lib文件都是静态库文件)总表如下,
libcaffe.lib
libhdf5.lib
libhdf5_hl.lib
libszip.lib
libzlib.lib
opencv_world310d.lib
gflags.lib
glog.lib
leveldbd.lib
lmdbd.lib
libprotobufd.lib
libopenblas.dll.a
libboost_python-vc140-mt-gd-1_65_1.lib
libboost_thread-vc140-mt-gd-1_65_1.lib
下面是我碰到的报错的地方。
error C4996 std::transform::_Unchecked_iterators::_Deprecate
1>d:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(959): error C4996: 'std::transform::_Unchecked_iterators::_Deprecate': Call to 'std::transform' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1> d:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(959): note: 参见“std::transform::_Unchecked_iterators::_Deprecate”的声明
1> e:\avot\eco-1\eco\interpolator.cpp(35): note: 参见对正在编译的函数 模板 实例化“_OutIt std::transform<cv::MatIterator_<_Tp>,cv::MatIterator_<_Tp>,float(__cdecl *)(float)>(_InIt,_InIt,_OutIt,_Fn1)”的引用
解决办法:
在属性==〉C、C++ ==〉命令行中,添加 -D_SCL_SECURE_NO_WARNINGS
别把boost的release和debug弄混了(boost有自己的命名规则),否则报错
1>libboost_thread-vc140-mt-1_65_1.lib(thread.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(ECO.obj 中)
1>libboost_thread-vc140-mt-1_65_1.lib(thread.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”(ECO.obj 中)
1>libboost_thread-vc140-mt-1_65_1.lib(tss_pe.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(ECO.obj 中)
1>libboost_thread-vc140-mt-1_65_1.lib(tss_pe.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”(ECO.obj 中)
原因
debug使用了release文件
因为thread在编译中一共出现了
libboost_thread-vc110-mt-1_53.lib
libboost_thread-vc110-mt-gd-1_53.lib
libboost_thread-vc110-mt-s-1_53.lib
libboost_thread-vc110-mt-sgd-1_53.lib
这4个lib
mt:表示多线程,d:表示debug,s:标识static
指定与你项目连接的运行期库
/MT多线程应用程序
/Mtd多线程应用程序(DEBUG)
/MD多线程DLL
/MDd多线程DLL(DEBUG)
如果你在项目中是这样添加:项目属性---链接器---输入---附加依赖项中:D:\boost1\boost_1_53_0\stage\lib\*.lib
那么即使你的连接库中都含有debug和relase版本的库,但是release版本的顺序放在了debug前面,就会出现上述原因
解决方法:
在项目属性---链接器---输入---附加依赖项中添加下面的。
D:\developSoftware\boost1\boost_1_53_0\stage\lib\*mt-gd*.lib
或者编译的时候你不在:项目属性---链接器---输入---附加依赖项中添加任何.lib路径,而是根据程序每次提示需要什么.lib然后加入到附加依赖项中就行了
最直接解决办法:不使用通配符,一个一个加。这是在debug环境,使用有gd的debug版本,否则使用无gd的release版本。
libboost_python-vc140-mt-gd-1_65_1.lib
libboost_thread-vc140-mt-gd-1_65_1.lib
warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
这个 warning 貌似没什么在影响,我在linker的命令行添加了一句
/VERBOSE:LIB
让VS自个去找一找这些LIB文件吧。
libHDF5找不到pdb的问题(其他如果有缺少pdb的,原理相同)
1>libhdf5.lib(H5.obj) : warning LNK4099: 未找到 PDB“hdf5-static.pdb”(使用“libhdf5.lib(H5.obj)”或在“E:\AVOT\ECO-1\x64\Debug\hdf5-static.pdb”中寻找);正在链接对象,如同没有调试信息一样
………………(这里会显示一大长串类似的信息)
1> 1>
1>libhdf5.lib(H5lib_settings.obj) : warning LNK4099: 未找到 PDB“hdf5-static.pdb”(使用“libhdf5.lib(H5lib_settings.obj)”或在“E:\AVOT\ECO-1\x64\Debug\hdf5-static.pdb”中寻找);正在链接对象,如同没有调试信息一样
………………
1>libzlib.lib(zutil.obj) : warning LNK4099: 未找到 PDB“zlib-static.pdb”(使用“libzlib.lib(zutil.obj)”或在“E:\AVOT\ECO-1\x64\Debug\zlib-static.pdb”中寻找);正在链接对象,如同没有调试信息一样
原因:pdb是调试时用到的VC文件,如果你不需要逐步调试libhdf5,这个无所谓,如果你想调试的话,可到https://support.hdfgroup.org/downloads/index.html
去下载
HDF5 download CMake windows
参考
https://support.hdfgroup.org/HDF5/release/cmakebuild518.html
https://support.hdfgroup.org/HDF5/release/obtain518.html
编译也很简单,解压缩(安装)后直接cmd下运行build-VS2015-64.bat文件即可生成hdf5.sln,用visualStudio2015打开后直接选择debug模式编译,基本没有碰到问题,里面就有这些PDB文件,注意pdb文件是绝对路径,别人的拷贝给你可能也调试不了程序(貌似提示输入路径后仍然可以,会麻烦点)。
ECO所需要的lib
为了一眼看明白,我把ECO项目所用的debug版的全部lib都列在下面,当然包括了这个hdf5的4个lib
libcaffe.lib
libhdf5_D.lib
libhdf5_hl_D.lib
libszip_D.lib
libzlib_D.lib
opencv_world310d.lib
gflags.lib
glog.lib
leveldbd.lib
lmdbd.lib
libprotobufd.lib
libopenblas.dll.a
libboost_python-vc140-mt-gd-1_65_1.lib
libboost_thread-vc140-mt-gd-1_65_1.lib
注意需要调试的话,把那些pdb文件放在那4个*_D.lib文件旁边。
Protobuf3.1
caffe默认的是protobuf3.0,需要改成protobuf3.1,否则会出现版本不兼容的报错,我在caffe中已经更新protobuf到3.1, 这个我在做其他项目时有写过一篇类似的记录。
运行时错误:Unknown layer type
错误由layer_factory.hpp中的函数static shared_ptr<Layer<Dtype> > CreateLayer(const LayerParameter& param)引发,原因是静态链接没有成功。说起来稍微有点复杂,可以参考这里
https://github.com/nicewsyly/ECO/issues/21
或者这里
https://github.com/BVLC/caffe/issues/4746
解决方案是使用静态方式编译(建议直接拖到caffe项目中并引用其libcaffe),并且设置好linker->general->使用库依赖项输入即可。