简单快捷建立自己的caffe工程
来源:互联网 发布:官网淘宝店铺装修模板 编辑:程序博客网 时间:2024/06/07 20:43
建立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,找到开头<BuildDir>这一行,改为
<BuildDir>$(SolutionDir)..\Build</BuildDir>
这句话是设置编译路径,我们的程序需要用到其中的一些依赖,后面会用到。打开nuget.config文件,将
<add key="repositoryPath" value="..\..\NugetPackages" />
改为
<add key="repositoryPath" value="..\NugetPackages" />
改过之后的意思是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中,并进行修改。
修改前:
<Import Project="..\..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props" Condition="Exists('..\..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props')" /> <Import Project="..\..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props" Condition="Exists('..\..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props')" /> <Import Project="..\..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props" Condition="Exists('..\..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props')" />修改后:
<Import Project="..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props" Condition="Exists('..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.props')" /> <Import Project="..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props" Condition="Exists('..\..\NugetPackages\glog.0.3.3.0\build\native\glog.props')" /> <Import Project="..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props" Condition="Exists('..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.props')" />
这三行大概是导入一些依赖的设置,我也不太懂,如果工程不直接使用源码,可以根据情况删减,以下类似。
其次找到以下几行,复制,这几行是导入设置信息
<ImportGroup Label="PropertySheets" Condition="Exists('$(SolutionDir)\CommonSettings.props')"> <Import Project="$(SolutionDir)\CommonSettings.props" /> </ImportGroup>最后,找到以下几行,复制并修改(目录相对关系改为..\..\)。
修改后;
<ItemGroup> <None Include="packages.config" /> </ItemGroup> <ImportGroup Label="ExtensionTargets"> <Import Project="..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.targets" Condition="Exists('..\..\NugetPackages\OpenCV.2.4.10\build\native\OpenCV.targets')" /> <Import Project="..\..\NugetPackages\OpenBLAS.0.2.14.1\build\native\openblas.targets" Condition="Exists('..\..\NugetPackages\OpenBLAS.0.2.14.1\build\native\openblas.targets')" /> <Import Project="..\..\NugetPackages\glog.0.3.3.0\build\native\glog.targets" Condition="Exists('..\..\NugetPackages\glog.0.3.3.0\build\native\glog.targets')" /> <Import Project="..\..\NugetPackages\hdf5-v120-complete.1.8.15.2\build\native\hdf5-v120.targets" Condition="Exists('..\..\NugetPackages\hdf5-v120-complete.1.8.15.2\build\native\hdf5-v120.targets')" /> <Import Project="..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.targets" Condition="Exists('..\..\NugetPackages\gflags.2.1.2.1\build\native\gflags.targets')" /> <Import Project="..\..\NugetPackages\boost_chrono-vc120.1.59.0.0\build\native\boost_chrono-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_chrono-vc120.1.59.0.0\build\native\boost_chrono-vc120.targets')" /> <Import Project="..\..\NugetPackages\boost_date_time-vc120.1.59.0.0\build\native\boost_date_time-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_date_time-vc120.1.59.0.0\build\native\boost_date_time-vc120.targets')" /> <Import Project="..\..\NugetPackages\boost_filesystem-vc120.1.59.0.0\build\native\boost_filesystem-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_filesystem-vc120.1.59.0.0\build\native\boost_filesystem-vc120.targets')" /> <Import Project="..\..\NugetPackages\boost_system-vc120.1.59.0.0\build\native\boost_system-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_system-vc120.1.59.0.0\build\native\boost_system-vc120.targets')" /> <Import Project="..\..\NugetPackages\boost.1.59.0.0\build\native\boost.targets" Condition="Exists('..\..\NugetPackages\boost.1.59.0.0\build\native\boost.targets')" /> <Import Project="..\..\NugetPackages\boost_thread-vc120.1.59.0.0\build\native\boost_thread-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_thread-vc120.1.59.0.0\build\native\boost_thread-vc120.targets')" /> <Import Project="..\..\NugetPackages\boost_python2.7-vc120.1.59.0.0\build\native\boost_python-vc120.targets" Condition="Exists('..\..\NugetPackages\boost_python2.7-vc120.1.59.0.0\build\native\boost_python-vc120.targets')" /> <Import Project="..\..\NugetPackages\protobuf-v120.2.6.1\build\native\protobuf-v120.targets" Condition="Exists('..\..\NugetPackages\protobuf-v120.2.6.1\build\native\protobuf-v120.targets')" /> <Import Project="..\..\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\LevelDB-vc120.targets" Condition="Exists('..\..\NugetPackages\LevelDB-vc120.1.2.0.0\build\native\LevelDB-vc120.targets')" /> <Import Project="..\..\NugetPackages\lmdb-v120-clean.0.9.14.0\build\native\lmdb-v120-clean.targets" Condition="Exists('..\..\NugetPackages\lmdb-v120-clean.0.9.14.0\build\native\lmdb-v120-clean.targets')" /> </ImportGroup>
3、打开工程,设置属性
首先,在属性窗口中找到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使用,这样最简单快捷。
- 简单快捷建立自己的caffe工程
- 利用caffe建立自己的工程
- 简单快捷解决caffe源代码在其他工程(MFC、QT、win32)中调用的问题
- 建立自己的libevent工程
- django建立自己的工程
- Windows下编译caffe,建立caffe的vs工程
- VS下建立自己的caffe工程项目
- caffe-windows添加自己的工程
- STM32根据库建立自己的工程
- STM32根据库建立自己的工程
- caffe 在windows下建立VS2015的工程, GPU
- Caffe: 安装Caffe的最快捷方法
- window10+caffe(新版)+自己工程
- 建立一个简单的android涂鸦工程
- 为C6713建立一个简单的工程
- VS2013调用caffe新建自己的工程详细过程
- VS2013调用caffe新建自己的工程详细过程
- 简单建立自己的符号服务器(转)
- java关于代码块 , 动态代码块 , 静态代码块 , 静态方法 , 构造函数的执行顺序
- java的反射机制
- c++注释规范
- CSU 1963 斜率DP
- hinernate中的Component组合映射
- 简单快捷建立自己的caffe工程
- 第1篇 进程和线程
- python虚拟环境的配置
- 文件、文件系统、关于文件的函数
- 指针数组和数组指针的区别
- 两个链表的交叉
- Windows下给python安装scrapy详细教程
- 在使用Struts时遇到的各种错误总结
- 个人项目经历---玩转山大