这个是以前的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
true
false
false
false
8.0
true
false
false
特别注意:这个 cufft.lib 要改成 否则 $(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::_Deprecate1>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(_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.1caffe默认的是protobuf3.0,需要改成protobuf3.1,否则会出现版本不兼容的报错,我在caffe中已经更新protobuf到3.1, 这个我在做其他项目时有写过一篇类似的记录。
运行时错误:Unknown layer type错误由layer_factory.hpp中的函数static shared_ptr CreateLayer(const LayerParameter& param)引发,原因是静态链接没有成功。说起来稍微有点复杂,可以参考这里https://github.com/nicewsyly/ECO/issues/21 或者这里https://github.com/BVLC/caffe/issues/4746 解决方案是使用静态方式编译(建议直接拖到caffe项目中并引用其libcaffe),并且设置好linker->general->使用库依赖项输入即可。