visual studio 版本问题: MicrosoftCaffe supports only visual studio 2013 Caffe(HappyNear) supports visual studio 2015 我这里使用visual studio 2015
因为有个项目protobuf3.1冲突,重新编译HappyNear的Caffe + visual studio 2015 + protobuf3.1
关于如何编译caffe+vs2015, 建议参考Caffe+Visual Studio 2015编译可以有多简单?,我这里只记录自己碰到的其他问题。
原地址:https://github.com/happynear/caffe-windows
不使用cuda,项目libcaffe无法加载的问题在commonSettings.props中设置不使用cuda之后,保存,重新启动vs2015,重新加载,多来两次,就能加载成功,否则会一直报错:没有cuda8.0blablabla…
我的配置如下,
true
false
false
false
8.0
true
false
true
特别注意:这个
cufft.lib
要改成
否则
$(CudaDependencies)会报错找不到依赖cufft.lib
这两个可以开通,没有影响
true
true
但是,如果没有安装matlab, 就不要使用matlabsupport,否则会提示无法找到mex.h而通不过编译
特别注意,不使用cuda时:这个 cufft.lib 要改成 否则 $(CudaDependencies)会报错找不到依赖cufft.lib
无法打开文件“python36_d.lib”2>------ 已启动生成: 项目: pycaffe, 配置: Debug x64 ------ 2> PythonPreBuild.cmd : Create output directories for python scripts. 2> PythonPreBuild.cmd : Create dummy init.py file 2> PythonPreBuild.cmd : Generating src\caffe\proto\caffe.pb.h with python bindings 2>LINK : fatal error LNK1104: 无法打开文件“python36_d.lib”
解决办法:compile python3.6.5 on windows and copy this file to the relevant location,
自己编译一下python3.6.5,拷贝python36_d.lib到anaconda3目录下即可
e.g. D:\Anaconda3\libs\python36_d.lib
注意用visual studio 2015打开pcbuild.sln即可完成编译,我的路径是 E:\APython\Python-3.6.5\PCbuild
我是把debug和Release都自己编译了,可以灵活应用。如果不想编译,去找一下直接用编译好的binary应该也可以。
去掉将警告视为错误,否则诸多项目无法通过所有的项目都要去掉这个设置,属性==>C/C++ > setting>将警告视为错误 ==> No
取决于你的需要,这些项目包括:
test.all
pycaffe.
caffe.binding
caffe.binding,这里还要改成dll动态库另外caffe.binding,这里还要改成dll动态库,不要用exe应用程序(我的默认是exe,奇怪了),否则会提示找不到这个*.dll:
例如我的情况是:
E:\Caffehappynear\caffe-windows-ms\windows…\Build\x64\Debug\caffe.binding.dll
Protobuf3.1因为我的Caffe要支持其他项目的protobuf3.1,出现protobuf冲突。所以我改成了protobuf3.1。
编译本机Protobuf3.10的位置我的本机位置在 E:\general\protobuf-3.1.0\dev\protobuf.sln 编译完成后将相关文件拷贝到caffe-windows-ms/windows/third_party下面即可
HAVE_LONG_LONGhappynear默认使用protobuf3.0, 如果改成3.1 (for eco visual object tracking)
在type_traits.h中,下面的代码要注释掉,否则会报错
//#ifdef HAVE_LONG_LONG
//template struct is_integral : true_type { };
//template struct is_integral : true_type { };
//#endif
参考
https://github.com/protocolbuffers/protobuf/pull/2203
https://github.com/protocolbuffers/protobuf/issues/2202
Protobuf3.1静态编译如果要编译静态库(一般情况下,应该使用静态库),就要去掉__declspec前缀,此时所有项目,都必须去掉PROTOBUF_USE_DLLS(这个是DLL必须的,参考readme.md from here) 也就是说,下面这些项目, libprotobuf / libprotobuf-lite / libprotoc / protoc.exe C\C++预编译选项中要去掉:PROTOBUF_USE_DLLS