主要看这篇文章,有点小瑕疵,瑕不掩瑜。参考链接:http://www.bubuko.com/infodetail-902302.html

文中红色标记为文章小瑕疵的地方,在此文中标记出来,做为修改对上一文的补充。

参考原文链接:http://blog.csdn.net/joshua_1988/article/details/45048871

         2014年4月的时候自己在公司就将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本来也装了Ubuntu可以很方便的配置好,无奈在家的风格是“娱乐的时候抽空学习”,所以移植到Windows还是很有必要的。但是,公司禁止将公司内部资料带出,很多地方又都忘记了,周末磨了一天终于移植完,本篇为记录将Caffe移植至Windows7 x64系统下的一些关键步骤。下面介绍如何从源码建立VS2013工程。

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编译

property--> Build dependencies --> Build Customizations... --> CUDA 6.5 --> OK

5.  设置一些工程下的路径,注意Debug和Release下都要设置

在Project --> Properties --> Configuration Properties --> VC++ Directories --> Include Directories中添加openblas、opencv、boost和cuda,例如

C:\Tools\boost_1_57\include;

C:\Tools\OpenBLAS_MinGW\include;

C:\Tools\opencv\build\include;

C:\Tools\opencv\build\include\opencv;

C:\Tools\opencv\build\include\opencv2;

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include;

在Project --> Properties --> Configuration Properties --> VC++ Directories --> Library Directories中添加openblas、opencv、boost和cuda,例如

C:\Tools\OpenBLAS_MinGW\lib;

C:\Tools\opencv\build\x64\vc12\lib;

C:\Tools\boost_1_56\lib64-msvc-12.0;

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib\x64;

6. 将压缩包内的include、src和tools文件夹拷贝到工程根目录下,同时把整理好的3rdparty文件夹也拷贝到工程目录下

7.  添加caffe的路径和3rdparty中第三方依赖库的路径,同样Debug和Release都要设置

在Project --> Properties --> Configuration Properties --> C/C++ --> General --> Additional Include Directories中添加

../include;../src

../3rdparty/include

../3rdparty/include/hdf5

../3rdparty/include/lmdb

C:\Tools\Caffe-3rd\include;

在Project --> Properties --> Configuration Properties --> Linker --> General --> Additional Library Directories中添加

../3rdparty/lib

C:\Tools\Caffe-3rd\lib\LevelDB;

C:\Tools\Caffe-3rd\lib\lmdb;

C:\Tools\Caffe-3rd\lib\openblas;

C:\Tools\Caffe-3rd\lib\protobuf;

C:\Tools\Caffe-3rd\lib\snappy;

在Project --> Properties --> Configuration Properties --> Linker --> Input --> Additional Dependencies中添加

opencv_core2410.lib

opencv_highgui2410.lib

opencv_imgproc2410.lib

opencv_ts300.lib

opencv_world300.lib

cudart.lib

cublas.lib

curand.lib

gflags.lib

libglog.lib

libopenblas.dll.a

libopenblas.lib

libprotobuf.lib

libprotoc.lib

leveldb.lib

lmdb.lib

libhdf5.lib

libhdf5_hl.lib

Shlwapi.lib

注意在Debug下应添加xxxd.lib形式的自己确认一下debug命名 静态库

opencv_core2410d.lib

opencv_highgui2410d.lib

opencv_imgproc2410d.lib

opencv_ts300d.lib

opencv_world300d.lib

cudart.lib

cublas.lib

curand.lib

gflagsd.lib

libglogd.lib

libopenblas.dll.a

libopenblas.lib

libprotobuf-gd.lib

libprotoc.lib

leveldbd.lib

lmdbd.lib

libhdf5.lib

libhdf5_hl.lib

Shlwapi.lib

8. 利用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路径,输入命令

编译blob.cpp

直接编译时会报错,缺少文件”caffe\proto\caffe.pb.h”

这个时候需要将proto.exe放到../3rdparty/bin文件夹

将 GernaratePB.bat 放在../scripts文件夹,点击运行,可以生成文件

可以看到在该路径下会生成caffe.pb.h和caffe.pb.cc,在D:\CODE\CXX\caffe\include\caffe中新建一个文件夹proto,

将生成的两个文件移动到D:\CODE\CXX\caffe\include\caffe\proto中

<del>cd C:\Tools\caffe-master\src\caffe\proto
protoc --cpp_out="." caffe.proto</del>

9. 准备mkstemp.h和mkstemp.cpp文件。

将mkstemp.h放在include/caffe/util/路径下,mkstemp.h中的内容为

 #include <windows.h>
#include <io.h>
int mkstemp(char *templates);

将mkstemp.cpp放在src/caffe/util/路径下,mkstemp.cpp中的内容为

/* mkstemp extracted from libc/sysdeps/posix/tempname.c.  Copyright
(C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc. The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. */ #include "caffe/util/mkstemp.hpp"
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h> static const char letters[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; /* Generate a temporary file name based on TMPL. TMPL must match the
rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
does not exist at the time of the call to mkstemp. TMPL is
overwritten with the result. */
int mkstemp (char *tmpl)
{
int len;
char *XXXXXX;
static unsigned long long value;
unsigned long long random_time_bits;
unsigned int count;
int fd = -1;
int save_errno = errno; /* A lower bound on the number of temporary files to attempt to
generate. The maximum total number of temporary file names that
can exist for a given template is 62**6. It should never be
necessary to try all these combinations. Instead if a reasonable
number of names is tried (we define reasonable as 62**3) fail to
give the system administrator the chance to remove the problems. */
#define ATTEMPTS_MIN (62 * 62 * 62) /* The number of times to attempt to generate a temporary file. To
conform to POSIX, this must be no smaller than TMP_MAX. */
#if ATTEMPTS_MIN < TMP_MAX
unsigned int attempts = TMP_MAX;
#else
unsigned int attempts = ATTEMPTS_MIN;
#endif len = strlen (tmpl);
if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
{
errno = EINVAL;
return -1;
} /* This is where the Xs start. */
XXXXXX = &tmpl[len - 6]; /* Get some more or less random data. */
{
SYSTEMTIME stNow;
FILETIME ftNow; // get system time
GetSystemTime(&stNow);
stNow.wMilliseconds = 500;
if (!SystemTimeToFileTime(&stNow, &ftNow))
{
errno = -1;
return -1;
} random_time_bits = (((unsigned long long)ftNow.dwHighDateTime << 32)
| (unsigned long long)ftNow.dwLowDateTime);
}
value += random_time_bits ^ (unsigned long long)GetCurrentThreadId (); for (count = 0; count < attempts; value += 7777, ++count)
{
unsigned long long v = value; /* Fill in the random bits. */
XXXXXX[0] = letters[v % 62];
v /= 62;
XXXXXX[1] = letters[v % 62];
v /= 62;
XXXXXX[2] = letters[v % 62];
v /= 62;
XXXXXX[3] = letters[v % 62];
v /= 62;
XXXXXX[4] = letters[v % 62];
v /= 62;
XXXXXX[5] = letters[v % 62]; fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, _S_IREAD | _S_IWRITE);
if (fd >= 0)
{
errno = save_errno;
return fd;
}
else if (errno != EEXIST)
return -1;
} /* We got out of the loop because we ran out of combinations to try. */
errno = EEXIST;
return -1;
}

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函数替换为_openclose函数替换为_close

将util/io.cpp中ReadProtoFromBinaryFile函数中的int fd = open(filename, O_RDONLY);替换为int fd = open(filename, O_RDONLY | O_BINARY);

在util/math_functions.cpp中添加

#define __builtin_popcount __popcnt
#define __builtin_popcountl __popcnt

在common.cpp中添加#include <process.h>

pid = getpid();替换为pid = _getpid(); (这里本来有个笔误,谢谢dongb5lz的提醒)

注释掉::google::InstallFailureSignalHandler();

将solver.cpp中的snprintf函数替换为sprintf_s


编译吧!!!!

.....................

按照文章http://www.bubuko.com/infodetail-902302.html里面的顺序编译.....,排错逐个排除....

VS2013(Win10X64)-配置编译Caffe的更多相关文章

  1. VS2013配置编译Caffe-Win10_X64

    原文链接:http://blog.csdn.net/joshua_1988/article/details/45036993 有少量修改................ 2014年4月的时候自己在公司 ...

  2. ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录

    已有条件: ubuntu14.04+cuda7.5+anaconda2(即python2.7)+matlabR2014a 上述已经装好了,开始搭建caffe环境. 1. 装cudnn5.1.3,参照: ...

  3. vs2015编译caffe

    有些时候,需要在python3的环境下import caffe,需要用vs2015在python3的环境下,编译pycaffe. microsoft的windows版本的caffe,依赖的库Nuget ...

  4. ubuntu下 编译Caffe的Matlab接口

    一般情况下不愿意使用Caffe的Matlab接口,总觉得Linux版的Matlab很难配置,但是现在搞目标检测,得到的源码是使用的Caffe的Matlab接口,只能硬着头皮上了. (1)修改caffe ...

  5. windows下编译caffe报错:error MSB4062: 未能从程序集 E:\NugetPackages\OpenCV.2.4.10\......的解决办法

    参考博客:http://blog.csdn.net/u013277656/article/details/75040459 在windows上编译caffe时,用vs打开后会自动加载还原NugetPa ...

  6. 在vs2013上的编译tesseract-ocr

    在vs2013上的编译tesseract-ocr OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程. Tesserac ...

  7. vs2013下配置opencv1.0.0

    vs2013下配置opencv1.0.0 2019-4-25 17:13:13 原因 现在最新opencv已经到4.0.1版了.用opencv1.0原因: 小.源码包只有10M左右. 清晰.他的文档结 ...

  8. Ubuntu16.04安装编译caffe以及一些问题记录

    前期准备: 最好是python虚拟环境 [anaconda的创建虚拟环境] 创建 conda create -n caffeEnv(虚拟环境名字) python=3.6 激活环境 source act ...

  9. 【Caffe】Ubuntu16.04上配置安装caffe(Only CPU)

    一.首先看看自己的系统,Ubuntu16.04,cpu,没有Nvidia,没有opencv 二.安装依赖包 安装protobuf,leveldb,snappy,OpenCV,hdf5, protobu ...

随机推荐

  1. 53. Maximum Subarray(动态规划)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. Java基础学习总结(74)——Java常见笔试题及答案汇总

    1. 下面哪些是合法的标识符?(ABE )--标识符 A. $persons B. TwoUsers C. *point D. this E. _endline 2. 下面程序运行的结果是( D )- ...

  3. Object Detection: To Be Higher Accuracy and Faster

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51597496 在深度学习中有一类研究热 ...

  4. 【ACM】NYOJ_288_Time_20130725

    Time时间限制:1000 ms  |  内存限制:65535 KB 难度:2描述 Digital clock use 4 digits to express time, each digit is ...

  5. JQuery获取select选中值和清除选中状态(转)

    1.获取值 var provinceSearch = $("#loc_province_search").find("option:selected").att ...

  6. JAVA模拟登录实例

    近期在做公司一个web项目.要求在我们的系统上,可以显示其它站点上的数据. 刚開始接到这个任务时,还在想.简单的非常.直接用UrlConection直接进入该网页,然后获取该网页的html,取到想要的 ...

  7. [RxJS] exhaustMap vs switchMap vs concatMap

    exhaustMap: It drop the outter observable, just return the inner observable, and it waits until prev ...

  8. nginx+tomcat反复请求

    好久不写技术文章了,越发的认为单纯的讲技术没啥意思.怪不得知乎越来越火.由于大家都喜欢看故事.不喜欢硬生生的技术文章.笔者今天就来就给大家讲故事:) 近期站点压力突然增大,把带宽都占满了,訪问网页发现 ...

  9. 二分查找(c &amp; c++)

    typedef int ElemType; C版本号 [递归版本号] int binSearch2(ElemType List[] ,int x,int head,int tail){ //递归版本号 ...

  10. luogu2154 [SDOI2009] 虔诚的墓主人 离散化 树状数组 扫描线

    题目大意 公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.一块墓地的虔诚度是指以这块墓地为中心的十字架的数目,一个十字架可以看成中间是墓地,墓地的正上.正 ...