2014年4月的时候自己在公司就将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本来也装了Ubuntu可以很方便的配置好,无奈在家的风格是“娱乐的时候抽空学习”,所以移植到Windows还是很有必要的。但是,公司禁止将公司内部资料带出,很多地方又都忘记了,周末磨了一天终于移植完,本篇为记录将Caffe移植至Windows7 x64系统下的一些关键步骤。下面介绍如何从源码建立VS2013工程。
Table of Content
- Content
{:toc}
1. 下载源码
从https://github.com/BVLC/caffe下载caffe源码,master或者dev版本都可以,本文中以dev为例
2. 建立工程
新建一个空的控制台VS2013工程,起名为caffe-dev。
File —> New —> Project
选择Win32 Console Application
选择工程路径,比如D:\CODE\CXX
给项目命名caffe-dev
单击OK后选择Empty project
3. 将工程的Solution Platform改为x64
Build —> Configuration Manager —> Active solution platform —> new —> x64 —> OK
4. 设置CUDA编译
Project —> Build Customizations… —> CUDA 7.0 —> OK
5. 设置一些工程下的路径
注意Debug和Release下都要设置
在Project —> Properties —> Configuration Properties —> VC++ Directories —> Include Directories中添加openblas、opencv、boost和cuda,例如
1 | D:\LIBS\boost_1_57_0;D:\LIBS\OpenBLAS\include |
在Project —> Properties —> Configuration Properties —> VC++ Directories —> Library Directories中添加openblas、opencv、boost和cuda,例如
1 | D:\LIBS\OpenBLAS\lib |
6. 拷贝源码
将压缩包内的include、src和tools文件夹拷贝到工程根目录下,同时把整理好的3rdparty文件夹也拷贝到工程目录下
7. 添加第三方依赖库路径
添加caffe的路径和3rdparty中第三方依赖库的路径,同样Debug和Release都要设置
在Project —> Properties —> Configuration Properties —> C/C++ —> General —> Additional Include Directories中添加
1 | ../include;../src |
在Project —> Properties —> Configuration Properties —> Linker —> General —> Additional Library Directories中添加
1 | ../3rdparty/lib |
在Project —> Properties —> Configuration Properties —> Linker —> Input —> Additional Dependencies中添加
1 | opencv_core2410.lib |
注意在Debug下应添加xxxd.lib形式的静态库
1 | opencv_core2410d.lib |
8. 生成pb文件
利用protoc.exe和caffe.proto生成caffe.pb.h和caffe.pb.cc文件
在编译protobuf的时候会生成一个可执行文件protoc.exe,在工程的D:\CODE\CXX\caffe-dev\src\caffe\proto路径下有一个文件叫caffe.proto,可以将protoc.exe拷贝到该路径下,在命令行中进入D:\CODE\CXX\caffe-dev\src\caffe\proto路径,输入命令
1 | protoc.exe caffe.proto --cpp_output=./ |
可以看到在该路径下会生成caffe.pb.h和caffe.pb.cc,在D:\CODE\CXX\caffe\include\caffe中新建一个文件夹proto,将生成的两个文件移动到D:\CODE\CXX\caffe\include\caffe\proto中
9. 准备mkstemp.h和mkstemp.cpp文件。
将mkstemp.h放在include/caffe/util/路径下,mkstemp.h中的内容为
1 |
|
将mkstemp.cpp放在src/caffe/util/路径下,mkstemp.cpp中的内容为
1 | /* mkstemp extracted from libc/sysdeps/posix/tempname.c. Copyright |
10. 将caffe的源文件添加到工程中
将D:\CODE\CXX\caffe-dev\src\caffe路径下除了test文件中的所有源文件添加到工程中,如果想要跑一些测试代码,也可以把test中的源文件加进去
将D:\CODE\CXX\caffe-dev\include\caffe\proto下的caffe.pb.cc添加到工程中
将D:\CODE\CXX\caffe-dev\tools下的caffe.cpp添加到工程中
11. 修改一些代码
在include/caffe/common.hpp中添加#include <direct.h>
在include/caffe/util/io.hpp中添加#include "mkstemp.hpp"
,并将close
函数替换为_close
,将char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
替换为errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
将bnll_layer.cu中的const float kBNLL_THRESHOLD = 50.;
修改为#define kBNLL_THRESHOLD 50.
将util/db.cpp中的mkdir(source.c_str(), 0744)
修改为_mkdir(source.c_str())
将util/io.cpp中的open
函数替换为_open
,close
函数替换为_close
将util/io.cpp中ReadProtoFromBinaryFile函数中的int fd = open(filename, O_RDONLY);
替换为int fd = open(filename, O_RDONLY | O_BINARY);
在util/math_functions.cpp中添加
1 | #define __builtin_popcount __popcnt |
在common.cpp中添加#include <process.h>
将pid = getpid();
替换为pid = _getpid();
注释掉::google::InstallFailureSignalHandler();
将solver.cpp中的snprintf
函数替换为sprintf_s
编译吧!!!!