建立caffe工程需要的依赖比较多,手动添加太麻烦?!我们不妨换个视角,编译caffe_windows工程时,好像没添加依赖的路径(当然了,第一次编译下载比较慢),工程就编译好了,现在我们来解析下caffe_windows的工程设置文件,并一步一步建立了自己的工程,如果想看在caffe_windows中添加自己的工程,可以参考我的另外一篇文章caffe-windows添加自己的工程。
说明:
1、caffe_windows指的是caffe的根目录
2、先抛出结论,要在工程中使用caffe源码,最好是封装好导出dll使用,这样最简单快捷。
3、以下建立工程的路径、命名都只供参考,可以根据自己的实际情况更改。
4、我会建立一个win32控制台程序,并在其中使用caffe源码。我在MFC中直接使用caffe源码,编译的问题解决之后,点击运行就出现停止运行的情况,由于是MFC程序,不像控制台程序可以在cmd窗口中运行能看到错误提示。如果想在MFC、QT中使用,可以将caffe源码封装导出dll使用,导出方法,可以看我的一片文章简单快捷解决caffe源代码在其他工程(MFC、QT、win32)中调用的问题,在MFC、QT、win32控制台程序中调用dll的工程就比较简单,不需要caffe相关附加依赖库。
废话不多说,开始行动。
Step 1:首先建立工程,并复制相关文件
1、建立一个文件夹my_caffe_project
2、在VS2013中建立一个控制台程序my_caffe,位置在my_caffe_project下
3、将caffe_windows目录下的Build复制到my_caffe_project下,将caffe_windows目录下的include复制到my_caffe_project下并改名caffe_include,将caffe_windows同级目录下的NugetPackages复制到my_caffe_project下。
Step 2:修改工程属性
1、将caffe_windows\windows下的CommonSettings.props、CommonSettings.targets、nuget.config复制到my_caffe.sln同级目录下,用文本编辑器打开CommonSettings.props,找到开头
$(SolutionDir)..\Build
这句话是设置编译路径,我们的程序需要用到其中的一些依赖,后面会用到。打开nuget.config文件,将
改为
改过之后的意思是nuget依赖包在上一级目录中,编译的时候检测到已下载nuget依赖包,则不会重复下载。
2、将caffe_windows\windows\classification\packages.config复制到my_caffe_project\my_caffe\my_caffe下,并在关闭工程的情况下同时打开my_caffe_project\my_caffe\my_caffe\my_caffe.vcxproj、caffe_windows\windows\classification\classification.vcxproj
首先将classification.vcxproj中以下三行复制到my_caffe.vcxproj中,并进行修改。
修改前:
修改后:
这三行大概是导入一些依赖的设置,我也不太懂,如果工程不直接使用源码,可以根据情况删减,以下类似。
其次找到以下几行,复制,这几行是导入设置信息
最后,找到以下几行,复制并修改(目录相对关系改为..\..\)。
修改后;
首先,在属性窗口中找到VC++ Directories/Include Directories,分别添加三个路径
$(SolutionDir)..\caffe_include
$(SolutionDir)..\caffe_include\caffe\proto
.\
第三个是包含当前目录(my_caffe.vcxproj文件所在的目录),我的caffe代码放在这个目录。
其次,在属性窗口中找到VC++ Directories/Library Directories,添加
$(SolutionDir)..\Build
这个是包含所需要的库。
最后,在属性窗口中找到Linker/Input/Additional Dependencies。添加
libcaffe.lib
$(CudaDependencies)
Step 3,编写程序,编译
博主发现一个很尴尬的问题,当我把caffe写成.h、.cpp两个文件在控制台中使用,编译成功后在cmd窗口运行,提示说重复注册
这里我就觉得很奇怪,以前导出dll使用没有任何问题,那既然提示了,我就把这一行注释掉
然后编译再运行,会提示其他层也重复注册,我把其他层也注释掉了,后面就提示,未知层
由于之前我在caffe_windows中添加过控制台程序,并且也能正常运行,当时把caffe有关源码都放在main函数所在的.cpp中,然后照这个思路修改,果然又可以用了
目前不知道这个是什么原因,大家可以一起讨论。
可能出现的问题:
1、多次出现Treat Warning As Errors,不光要改工程的属性(找到C/C++/Treat Warning As Errors,将其改为no),而且要更改工程所有.cpp(可能是和caffe有关的cpp)的属性(右键属性,找到C/C++/Treat Warning As Errors,将其改为no)
2、包含路径设置了,但是程序去没有识别,可能是工程的编译版本与当前的解决方案的版本不一致,虽然问题很小,但是我遇到过几次了
工程属性1和工程属性2都要更改到解决方案属性一致。
总结
要在工程中使用caffe源码,最好是封装好导出dll使用,这样最简单快捷。