0%

最近在看一个特别古老的美剧《X档案》,特别小的时候断断续续看过一些,记得好像是在中央八电视剧频道演过。在Wiki上这个剧被定义为science fiction horror drama television series,听起来好像挺奇怪的,科幻恐怖剧。看了看还真是挺恐怖的,不知道小时候看这个是不是被吓得够呛。虽然这个剧有点年头了,1993-2002年在FOX电视台播出,但是现在再看剧情和拍摄手法依旧很吸引人,而且正是由于拍摄久远,导致画面很模糊,给这部电视剧添加了一种莫名的神秘感,模模糊糊的画面好像有意遮挡了一些真相,更符合这部剧的风格。

这部剧涵盖了外星人、超自然现象、政府骗局和阴谋论等等所有相关主题。其中印象最深刻的是第一季第10集还是第11集中的一小段片段,估计对我当时还幼小的心灵造成过心理阴影。这还得从小时候读到的一些东西说起,那时候经常读一些科幻或者科普的书或杂志,里面记录了很多科学之谜和UFO目击者的谈话记录,比如麦田怪圈和被外星人绑架什么的。有一段是讲一个农场里的牛一夜之间都死掉了,而且全都被割去了一只耳朵和一片嘴唇,但是农场主却没有察觉到任何异常,于是就有人解释说是外星人干的。看过这个故事之后,特别害怕自己那一天也会被外星人绑架,然后被割掉耳朵和嘴唇。后来在电视剧里有类似的剧情出现,女主问男主这样做的意义在于什么,男主回答说就好像我们解刨鱼和青蛙一样,这话真是说得令人毛骨悚然啊。也真是佩服自己小时候竟然受到过这么大的刺激,不知道这部电视剧在美国是不是儿童限制级。现在网络这么发达,估计现在的小孩可以接触到更恐怖的信息,不知道对他们来说是不是也埋藏了各种心理阴影。

最近出游比较多,五一假期之前的周末随公司去云蒙山爬山,假期去了无锡和苏州,张大夫在南京研究各种花花草草,让人不得不好好热爱了一把生活。其实说起出游,真正让我开始感觉到应该多去走走、体验不一样的生活,是去波兰的克拉科夫Krakow参加2013年的International Conference on Advanced Video and Signal based Surveillance,也是从那个时候开始让我觉得一个人出游的乐趣。在克拉科夫逛了很多地方,感受了当地丰富多彩的文化。因为是自己一个人,所以逛的很惬意,全程都是徒步,累了就在街边的露天餐馆歇一歇,其实就好像咱们国内的大排档,只不过对咱们来说少了烧烤的油烟,多了点小资的味道,喝点汤吃点面包,恢复恢复体力。本想回来好好记录一下这三天在克拉科夫的见闻,一犯懒一晃一年半过去了,记忆也都模糊了,不过能想起来的肯定都是精髓了。

8月26日俄航凌晨的飞机飞往莫斯科,由莫斯科转机到克拉科夫,网上说俄航的服务态度很差、经常丢行李,在莫斯科转机安检也很麻烦,不过我个人感觉还好,没有遇到什么太大的麻烦,但是由于航班的缘故,在莫斯科机场呆了四五个小时,没有当地签证,就只能干坐着,蹭着机场里龟速的WIFI发了两篇微博。飞机上最激动人心的就是看日出了,还没见过黄山的云海日出,先拿飞机上的充数吧。亲近亲近大自然,感受伟大的造物主,瞬间就会让生活中的磕绊困难显得渺小,充满了信心去生活,所以总有人说“去散散心吧”,大概就是因为如此吧!

从莫斯科往克拉科夫是只坐大约100人的小飞机,还是第一次坐这么小的飞机,起飞降落的时候还挺刺激的,遇到气流颠簸的更厉害点,水平震荡的幅度也大,感觉这才叫飞行,以前的飞行家还真是得有点冒险精神才行。

在克拉科夫的住处是一个离中心市集广场只有50米的小旅馆,旅馆在一个窄窄的幽静的小巷子里,住宿条件很一般,不过是那种特别典型的欧洲老房子,石头砌的墙壁,大大的木门、陡峭的木楼梯、吱吱作响的楼板。沿着小巷到中央市集广场就变得热闹多了,广场中心是一个大市场,算是市民生活的中心了。对于这个广场,我记忆最深刻不是市场本身,而是坐落在广场南侧的圣玛丽教堂,这个教堂有两座钟楼,较高的一栋是尖顶,另一栋是穹顶,大概是因为教堂修建历时太久,流行的风格已经变了。每隔一个小时,从钟楼顶部都会响起号角声,戛然而止的号角声让人感觉曲子是突然中断的,这是为了纪念13世纪的一名号手,他在蒙古人袭击城市时发出警报而被弓箭射中喉咙,正午的号角声由波兰国家电台向波兰国内外播放。这个故事给我留下了特别深刻的印象,以至于在我准备雅思口语时,把在这里的见闻作为回答有关建筑、旅行主题的素材。

克拉科夫是一座古老的城市,在公元700年前后建成,所以城中的建筑风格多种多样,有很多有趣的现象。例如刚刚说到的不对称的圣玛丽教堂,更有趣的是广场西南角的圣亚德伯堂,这座教堂有上下两层,下层是一个半地下室。实际上,这是两座教堂,半地下室是一座更为古老的教堂,在这座老教堂的正上方又重修了一座新教堂。一个有趣的说法是在古时候,人们不注意卫生,垃圾满街乱堆乱扔,久而久之真个城市的地面就被垫高了,最后不得不重修建了一座教堂。不知道这个说法的真实性怎么样,不过在克拉科夫确实有很多半地下室。

另一个不得不提的是坐落在城外瓦维尔山上的一座城堡——瓦维尔城堡,城堡背后是维斯瓦河,算是一个易守难攻的地方。在这里有着最古老的骑士屠龙的传说。很久很久以前,在瓦维尔山下维斯瓦河边的洞穴里住着一头恶龙,它要求人们每个月进贡一名美貌的少女让它吃掉。国王为了拯救全城的百姓许诺谁杀了这头邪恶的龙,他就把自己的女儿嫁给这位英雄。不过屠龙的并不是骑士,而是一名鞋匠铺的小学徒。他引诱龙吃下了塞满硫磺的羊,被烧的难受的龙拼命地喝维斯瓦河里的水,最后撑破了胃死去。后来国王就在这个地方建立了克拉科夫城,在瓦维尔山上建起了瓦维尔城堡。从此,小学徒和公主幸福地生活在城堡里。

城堡的正中央有一组废墟,那是最初城堡的所在地,很小,随着时间的推移,城堡不断扩建,变成了现在的模样。其中的瓦维尔主教座堂据说包含了欧洲几乎所有的建筑风格,研究欧洲建筑如果没有来考察过瓦维尔主教座堂可算是不称职的。城堡里有博物馆,藏有达芬奇的名画《抱银鼠的女子》。另一个让我惊喜的是见到了波兰翼骑兵的盔甲,记得小时候玩《帝国时代II》,其中的斥候骑兵就是背后插翅膀的,当时还觉得居然有这么奇怪的骑兵,这次算是见到真品了。抄一段百度百科上的话

13世纪,波兰人面对的主要敌人有两个:西北面的条顿骑士和东面的蒙古人。面对东线开阔的地形和机动的蒙古骑兵,波兰军不堪一击,1241年连当时的首都克拉科夫都让蒙古人给洗劫了一道。从14世纪起波兰的主要敌人是西边的条顿骑士,15世纪的13年战争是波兰崛起的开始。通过这场战争,波兰不仅驱逐了条顿势力,同时也锻炼了一支军队,其中以翼骑兵最为著名。

克拉科夫还是一座宗教城市,诞生了第一位波兰籍的教皇——约翰·保罗二世。约翰·保罗二世曾经发表过一些有关教会与犹太人关系的演讲,并经常对在犹太人大屠杀牺牲的犹太人表示敬意。1979年,他成为了第一个访问波兰奥斯威辛集中营的教皇。他是少数在犹太文化下长大的教皇。2000年3月,他访问耶路撒冷,他说:“犹太人是我们的兄长。”一些人认为这是承认天主教由犹太教所分出来,而耶稣最早的跟随者是犹太人。在城内一个神学院的窗口上有一幅他的画像,据说在成为教皇以前,作为克拉科夫的总主教,他经常坐在这个阳台上,与窗口外的神学院的学生和克拉科夫的市民交谈。在克拉科夫可能有上百座大大小小的教堂,包括一些已经成为废墟的教堂都被保留了下来。

还有一个大家熟知的故事也发生在这里,这就是《辛德勒的名单》。克拉科夫的卡齐米日地区,就是这部电影的舞台原型。很多年前看这部电影的时候,我从未想过自己可以走进电影中的场景。电影中很多实景在此拍摄,至今还可以找到。在这个工厂附近有很多犹太人的墓地,很多墓主人都是纳粹时期罹难的。英雄广场上有68张铜椅子组成的雕塑群,代表着曾在这里生活过的6.8万犹太人。空旷的广场,空荡荡的椅子,一派肃杀。身处其中不禁叹气,心中荡起无限悲凉。

最后说说维耶利奇卡的盐矿,公元八世纪的时候,这里发现了岩盐矿,十一世纪时开始大规模开采,十三世纪以后成为重要的岩盐来源,也成为波兰的重要财政来源。地下盐矿共九层,第一层距地面65米,第九层深达327米。坑道总长达到300公里,向游客开放大约10公里。这里的矿工不是奴隶或者赤贫者,他们有着很高的社会地位,收入丰厚并且受人尊敬。在漫长的岁月中,矿工们形成了把岩盐原料雕刻成各种物品的传统,地下教堂、圣坛、浮雕以及数以百计的真人大小的雕像都是他们的杰作。维耶利奇卡盐矿最大的礼拜堂位于地下101米处,长50多米,宽15米,高12米。其中有一幅盐雕的最后的晚餐,浮雕深度只有几厘米,但是从特定角度观察却立体感十足,令人称奇。每位游客还可以领取一袋这里出产的原盐,自己尝了尝,还是很咸的。

克拉科夫相对那些更为热门的欧洲旅游城市更为恬静舒适,而且处处都是景点,走几步就可以停下来细细的品味,特别适合溜溜达达的闲逛,让人自然而然地放松。

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
2
3
4
5
D:\LIBS\boost_1_57_0;D:\LIBS\OpenBLAS\include
D:\LIBS\opencv\build\include
D:\LIBS\opencv\build\include\opencv
D:\LIBS\opencv\build\include\opencv2
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include

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

1
2
3
4
D:\LIBS\OpenBLAS\lib
D:\LIBS\opencv\build\x64\vc12\lib
D:\LIBS\boost_1_57_0\lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64

6. 拷贝源码

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

7. 添加第三方依赖库路径

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

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

1
2
3
4
../include;../src
../3rdparty/include
../3rdparty/include/hdf5
../3rdparty/include/lmdb

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

1
../3rdparty/lib

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
opencv_core2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
cudart.lib
cublas.lib
curand.lib
gflags.lib
libglog.lib
libopenblas.dll.a
libprotobuf.lib
libprotoc.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.lib

注意在Debug下应添加xxxd.lib形式的静态库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
opencv_core2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
cudart.lib
cublas.lib
curand.lib
gflagsd.lib
libglogd.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.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
2
3
#include <windows.h>
#include <io.h>
int mkstemp(char *templates);

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/* 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中添加

1
2
#define __builtin_popcount __popcnt 
#define __builtin_popcountl __popcnt

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

pid = getpid();替换为pid = _getpid();

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

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

编译吧!!!!

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

在真正开始编译各依赖库之前,需要准备一些必备工具:

首先当然是VS2013,下载地址:https://www.visualstudio.com/

其次是CMake工具,下载地址:http://www.cmake.org/download/

Table of Content

  • Content
    {:toc}

1. Boost

下载地址:http://www.boost.org/

编译方法:

  1. 运行Visual Studio Tools中的VS2013 x64 Cross Tools Command Prompt终端工具
  2. 从终端进入boost库所在目录,如D:\LIBS\boost_1_57_0
  3. 运行bootstrap.bat生产64位的bjam.exe
  4. 输入命令进行编译,更正一下,msvc-12.0才是vs2013哈

静态库:bjam –build-type=complete toolset=msvc-9.0 toolset=msvc-12.0 threading=multi link=static address-model=64

共享库:bjam –build-type=complete toolset=msvc-9.0 toolset=msvc-12.0 threading=multi link=shared address-model=64

2. OpenCV

下载地址:http://opencv.org/downloads.html 本文中使用的是2.4.10版本

编译方法:

下载后的安装包中有已编译好的库,可直接引用,如D:\LIBS\opencv\build\x64\vc12

3. OpenBlas

下载地址:http://sourceforge.net/projects/openblas/files/

编译方法:

OpenBlas库在windows上编译起来比较复杂,这里给出的下载地址是一个已编译好的压缩包OpenBLAS-v0.2.14-Win32.zip (12.1 MB),直接提供了./bin ./include ./lib路径

4. CUDA

下载地址:https://developer.nvidia.com/cuda-downloads

编译方法:

与OpenCV类似,安装好后直接有已编译好的库。如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\include和C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64

以上是依赖库比较常用,最好将该它们的include和lib加入到Windows的环境变量中,方便后续的库的编译

5. GFlags

下载地址:https://github.com/gflags/gflags

编译方法:

  1. 启动CMake(cmake-gui)工具
  2. 设置source code路径和build路径
  3. 单击Configure按钮,并选择并选择Visual Studio 12 2013 Win64编译器编译器
  4. 更新完成后,勾选中BUILD_SHARED_LIBS和BUILD_STATIC_LIBS
  5. 单击Generate按钮,生成VS工程
  6. 打开刚刚生成的VS工程,build其中的ALL_BUILD工程,注意选择x64模式,并分别生成Debug和Release下的库
  7. 编译成功后,在工程路径下会生成bin、include、lib三个文件夹

6. GLog

下载地址:https://github.com/google/glog

编译方法:

该工程中包含VS工程google-glog.sln,打开直接编译即可,同样注意Solution Platform选择x64模式,并分别生成Debug和Release下的库

7. LevelDB

下载地址:https://github.com/bureau14/leveldb

这里没有选择官方的https://github.com/google/leveldb是由于官方版本移除了CMake的依赖项,自己写起来比较复杂

编译方法:

与编译GFlags方法类似,唯一需要注意的地方是将CMakeLists.txt中第82行的-DSNAPPY注释掉,否则需要依赖Snappy库,其实并不绝对需要,为了简单起见将此库去掉。另外Leveldb依赖于boost库,如果没有将boost库添加至环境变量,可能需要手动进行设置。

8. LMDB

下载地址:https://gitorious.org/mdb/mdb/archive/462dc097451834477b597447af69c5acc93182b7.tar.gz

编译方法:

  1. 解压压缩包到某路径,例如D:\CODE\CXX\mdb-mdb
  2. 在VS2013中新建工程,FILE –> New –> Project From Existing Code..
  3. 选取源码所在路径,并给工程起名
  4. 单击next按钮后选择Project type为Console application project
  5. 将Solution Platform修改为x64模式
  6. 注意将工程的输出改为静态库,右键单击工程 –> property –> Configuration Properties –> General –> Project Default –> Configureation Type –> Static library (.lib)
  7. 其中一个.c文件中包含了unistd.h,为了解决这个问题需要准备三个文件 unistd.h、getopt.h、getopt.c。unistd.h可以考http://stackoverflow.com/questions/341817/is-there-a-replacement-for-unistd-h-for-windows-visual-c解决。另外两个可以从http://ieng6.ucsd.edu/~cs12x/vc08install/getopt9.zip下载
  8. 最后编译即可

9. ProtoBuf

下载地址:https://github.com/google/protobuf

编译方法:

压缩包里有一个叫vsprojects的文件夹,其中有现成的VS工程,可以用来直接编译,也需要注意将Solution Platform修改为x64模式

10. HDF5

下载地址:http://www.hdfgroup.org/ftp/HDF5/current/src/CMake/hdf518-CMakeWindows.zip

编译方法:

解压后,在VS2013 x64 Cross Tools Command Prompt终端工具中运行build-VS2013-64.bat即可。

整理头文件和库文件

将5-10的头文件和编译后的库统一整理到一个3rdparty文件夹下,其中包含两个文件夹include和lib

include文件夹下包含gflags、glog、google、hdf5、leveldb、lmdb六个文件。gflags的头文件来自于生成的VS工程目录中的include文件夹;glog的头文件来自于VS工程目录中的src\windows文件夹;google中是protobuf的头文件,来自于压缩包中的src\google文件夹;hdf5来自于压缩包中的CMake\hdf5-1.8.14\src文件夹,保留.h文件即可;leveldb的头文件来自于压缩包的include文件夹;lmdb的头文件来自于压缩包中的libraries\liblmdb文件夹,保留.h文件即可

lib文件夹中的.lib文件直接从编译好的工程目录下拷贝即可,注意debug模式下的.lib文件的文件名修改为xxxd.lib形式

至此,caffe需要的各项依赖库已经准备完毕,后续会上一些图,看起来直观一些。