Ubuntu下编译caffe

纯粹是个人编译的记录。不用CUDA(笔记本是amd卡,万恶的nvidia);不手动编译依赖包(apt-get是用来干啥的?用来直接装二进制包,以及自动解决依赖项的)

caffe官方给出的ubuntu下的教程在http://caffe.berkeleyvision.org/install_apt.html

make: protoc: 命令未找到

解决办法:

  1. sudo apt-get install protobuf-c-compiler protobuf-compiler

fatal error: gflags/gflags.h:没有那个文件或目录

解决办法:

  1. sudo apt-get install libgflags-dev

顺便吐槽一下ubuntu的apt-get命令的补全,它是残破的。我想下载gflags,于是输入:

  1. sudo apt-get install gflags #此处直接按tab,希望它补全,tab一次不出来就再按一次

结果呢,只显示了一个结果:

  1. sudo apt-get install libgflags2v5

问题是,实际上有3个结果:libflags2v5,libgflags-dev,libgflags-doc

ubuntu的命令行,另一个残破的地方在于,各种包总是喜欢私自添加lib前缀,比如,好好的opencv,非得要libopencv才行(全名并不是libopencv和oepncv,通常都是用-dev或-devel各种的包)

fatal error: glog/logging.h: 没有那个文件或目录

尝试apt-get install glog,妈蛋,没有。要这样:

  1. sudo apt-get install libgoogle-glog-dev

fatal error: hdf5.h: 没有那个文件或目录

妈蛋!老子执行过apt-get install hdf5-tools了,怎么还说没有hdf5?而且我当时tab了好几下,只有两个结果,另一个是hdf5-helpers不装也罢。

其实,这又是ubuntu的命令行比较残破的原因。为什么不能完整点搜索?

当然这次,需要的不仅仅是一个-dev包,因为试了后还是报同样错误,那就尝试:

  1. sudo apt-get install libhdf5-\* #我用的shell是zsh,如果你没有用zsh,那就是默认的bash,那就把“\”去掉。这,是zsh比较残破的地方

然后再make all,还是报同样错误。怒了,这次是caffe自身的问题。要在Makefile.config中把hdf5的一个目录添加进来:

  1. # 找到这行:
  2. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
  3. # 替换为:
  4. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/

fatal error: lmdb.h: 没有那个文件或目录

擦,刚刚明明apt-get安装了lmdb-utils,怎么又来?而且,安装lmdb时tab了好几次只有这么一个有用的结果。

这次,又是ubuntu命令的残破引发的。

解决办法:

  1. sudo apt-get install liblmdb-dev

make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1

这次的问题有点大了。问题完整描述:

  1. AR -o .build_release/lib/libcaffe.a
  2. LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
  3. /usr/bin/ld: cannot find -lboost_python3
  4. collect2: error: ld returned 1 exit status
  5. Makefile:563: recipe for target '.build_release/lib/libcaffe.so.1.0.0-rc3' failed
  6. make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1

我也想不出办法,于是google之。发现caffe在github的repo上有人提出同样的问题:https://github.com/BVLC/caffe/issues/4045

然后,真是不友好或没有用的回答,维护caffe的都是什么鬼?!说什么,别在issue里提“使用,安装,编译出错”的问题,请使用caffe-users list。我就草,issue不是用来解决问题的么?user list是google group谷歌用户组,一个更不好用的东西,连markdown都没有,太落后了。anyway,这些都不管用。

管用的方法:再次修改Makefile.config(艹,caffe官方的Makefile.config你敢再残破一点么?市面上一共就3种最常用的跑caffe的平台,第一个就是ubuntu还搞这么用户不友好,第二个是fedora只能说还凑合因为fedora自身命令比ubuntu完善,第三个mac用户暂时不考虑,真正跑caffe的都是烧GPU的,mac用户管他干啥)

anyway,要这样改:

  1. # 原来
  2. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
  3. LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
  4. # 现在改成(64位系统):
  5. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
  6. LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
  7. # 或者,你是32位系统:
  8. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
  9. LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/i386-linux-gnu /usr/lib/i386-linux-gnu/hdf5/serial

这样就好了么?天真。还得执行非常肮脏的sed脚本!

  1. find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;

这个可能是ubuntu自身的问题,也可能是caffe的问题。

blas的问题

作为小白用户,方便起见,用不着去搞MKL,一则申请麻烦,二则太大。同时也要尽量避免手动编译。手动编译源码可能带来更多的依赖项问题。所以尽可能全都用apt-get安装。

  1. sudo apt-get install libopenblas-dev

reference

https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-15.10-Installation-Guide

https://github.com/SHUCV/caffe_demo/wiki/install-caffe-on-ubuntu14.04

==== update 2016年11月5日 17:39:33 ====

换ubuntu16.04了,编译caffe时会提示:memcpy未定义

解决方法:Makefile中,找到:

NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

换成

NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

ubuntu下编译caffe的更多相关文章

  1. ubuntu下 编译Caffe的Matlab接口

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

  2. ubuntu下编译VLC

    ubuntu下编译VLC 标签(空格分隔): ubuntu vlc 视频 编译 [TOC] 1.下载VLC源码包并解压 VLC的源码包在VLC的官网有,可以直接下载.也可以使用git来clone一个. ...

  3. 在Ubuntu下编译wpa_supplicant

    最近在研究WiFi联盟的多屏互动协议Miracast,其中需要用到wpa_supplicant,编译中遇到了一些问题,经过一下午的折腾也都解决了,下面分享给各位. 一.编译需要用到三个库源码包,分别是 ...

  4. 在Ubuntu下编译Assimp库

    在Ubuntu下编译Assimp库 怎样在Ubuntu下编译Assimp库?这是我曾经编译成功后做的笔记,供參考. 1.去以下的站点去下载Assimp库: http://assimp.sourcefo ...

  5. ubuntu下编译java程序

    ubuntu下编译java程序 首先需要安装jdk,并配置好相应环境变量 下面以简单的HelloWorld为例 文件名为HelloWorld.java java代码: public class Hel ...

  6. Ubuntu下编译Bilibili/ijkplayer

    在做Android客户端视频播放器的过程中熟悉ijkplayer.他在视频支持协议上要比Android原生的mediaplayer做的要好.因此,自己也基于Bilibili/ijkplayer的重新编 ...

  7. Ubuntu下编译SHTOOLS

    SHTOOLS是使用Fortran语言写的一个专门用于处理球谐函数的一个开源库,更多的介绍请猛戳这里,关于这个库的安装和使用,都在官网上有详细的说明,虽然很详细,但是编译的时候还是比较费劲,下面将我在 ...

  8. 开源播放器 ijkplayer (五) :Linux/Ubuntu 下编译ijkplayer

    一.安装Git与yasm sudo apt-get install git sudo apt-get install yasm 二.下载和配置 SDK.NDK SDK一般开发时肯定都有的,NDK一般是 ...

  9. 在Ubuntu下编译hadoop2.5.x

    在Ubuntu下编译hadoop2.5.x 参考博客:http://www.aboutyun.com/thread-8130-1-1.html 1 下载hadoop源码: (1) http://www ...

随机推荐

  1. oracle编程总结

    1,SEQUENCE的使用 问题:在MSSQL中,我们可以通过设置自增长来作为主键,但是oracle里面没有这个 解决方案:使用SEQUENCE来实现,具体步骤如下 (1)首先建立一个序列(就是每次查 ...

  2. SharePoint 2013:自定义ECB菜单项的添加

    本文分别介绍了两种常用的添加ECB菜单项的方式. 声明式创建 这也是微软最佳实践推荐的方式.在VS中创建一个SharePoint空解决方案,并添加一个“空元素”类型的SPI. 在Elements.xm ...

  3. java基础:所有参数皆是按值参数

    c#中对于参数的传递,有二种处理方式,默认情况下:值类型的参数,按值传递(即:方法体内的参数是原值的副本):引用类型的参数,"加ref关键字后“,按引用传递(即:方法体内的参数,是对象的指针 ...

  4. Oracle:ODP.NET Managed 小试牛刀

    “ODP.NET Managed”发布已经有一段时间了,近期正好有一个新项目,想尝试用一下,参考园子里的文章:<.NET Oracle Developer的福音——ODP.NET Managed ...

  5. C# 传值给C++

    http://www.cnblogs.com/xumingming/archive/2008/10/10/1308248.html C#(.net)中的DllImport    大家在实际工作学习C# ...

  6. .net程序员转行做手游开发经历(五)

    大家好,真的是好长时间都没有更新博客了.上来博客园发现很多朋友还在关注我们,那给大家汇报下最近的一些进展. 收费版上线了,但是下载量不是很多,刚发布的时候下载每天的下载还是挺多,我们几个小伙伴在论坛. ...

  7. Android闹钟设置的解决方案

    Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmMan ...

  8. NetFPGA

    From Wikipedia, the free encyclopedia The NetFPGA project[1] is an effort to develop open source har ...

  9. 用matlab实现同一个序列重复N倍

    同一个序列 重复N倍 怎么用matlab实现 可以使用repmat函数 repmat(A, 1, 3) 其中A即为复制的矩阵,1为纵向复制的次数,3即为横向复制的次数.

  10. 【Alpha版本】冲刺阶段——Day 3

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...