Ubuntu下SiftGPU源码编译

May 15,2017   8700 words   32 min

Tags: Linux

走了太多的坑,虚拟机也重装了5个,经过各种百度和学习,才算把任务完成。 这里完整记录一下过程和需要注意的地方,以备后用。

一、从下载开始

首先从Ubuntu官网下载系统镜像,如下所示,根据你的硬件选择32或64位,点击”下载”即可。下载地址在这 建议下载官方原版,不要下载优麒麟。虽然它是中文版的,但是运行速度非常慢。在我的电脑上是 这样。同样的配置运行官方原版就比较流畅。下载好后是一个iso镜像文件。如下

二、在虚拟机中安装

在VMware中安装很简单。这里假设你已经安装了VMware,如果没有请自行百度下载安装。打开后界面如下: 选择“创建新的虚拟机”,使用典型配置即可,然后需要找到我们刚刚下载的镜像文件,如下所示: 然后我们需要设置用户名和密码,任意写即可。 然后设置虚拟机名称和保存位置: 然后设置分配给虚拟机的磁盘大小,这根据你硬盘的情况设置即可。如果空间比较宽裕,可以设置大一些,如果比较紧张 可以设置小一些。但最小不能小于5G,否则会提示安装失败。这里我们设置大小为10G。 这样虚拟机配置便完成了。点击“完成”后便开始自动安装,大约需要半个小时左右,安装界面如下: 安装完成后,程序会自动打开虚拟机,进入登陆界面,如下,输入密码即可进入系统:

进入系统之后,如果发现系统无法联网,那么首先请检查主机是不是已经联网了。在之前便遇到 这种情况,结果一查发现是主机没有联网。如果主机已经正常联网了,但是虚拟机没网。那么你 需要检查VMware的网络服务是否打开。具体如下:
在Windows中打开控制面板→管理工具→服务,并找到VMware DHCP Services和VMware NAT Services,如下图。 并确保服务正在运行。如果没有,右键启动这两个服务。这样重新打开虚拟机,系统就应该可以正常联网了。

三、进入Ubuntu

打开系统后进入登陆界面,输入我们刚刚在虚拟机里设置的账户密码,即可登陆。进入Ubuntu后,你首先需要做以下几件事情:

1.修改root账户密码

首先需要设置root账户的密码,以及登录选项。Ununtu默认是不能登陆root账户的,需要设置才行。之前就是因为没有设置root密码,而将自己的账户升级权限成root后,出现了账户丢失的情况,只能以guest方式登录。但是这样是什么都修改不了的,用不了sudo命令。所以无奈只能删了重新装系统。
1.登陆系统,然后打开终端,输入sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf,如下: 这时会让你输入密码,注意输入的密码是不会显示的。所以不要以为是系统死机了什么的。回车之后系统会弹出一个编辑框。

2.编辑框如下所示。 在弹出的编辑框里输入:greeter-show-manual-login=true 保存关闭。

3.关闭之后,回到终端窗口,输入:sudo passwd root回车; 回车之后会要你输入两次密码,出现已成功更新密码字样即为成功。 这样我们便完成了root账户的密码设置,同时开启了手动输入用户名和密码登陆的模式。我们重启后如下图: 可以看到,相比于之前的登陆界面,多了login,点击依次输入root和密码,即可以登录到root账户了。 可以看到现在是以root身份登录的。而且新建文件和文件夹的选项都是可用的。在我们自己创建的账户中, 除了桌面,我们是没有权限在其它任何地方新建或拷贝文件的。只有在root账户中才能进行操作。这也就是 为什么首先就需要设置root密码并登录root账户的原因。在自建的账户中,虽然可以用sudo命令以root身份操作, 但是是没办法拷贝文件的。当然你可以用sudo以命令行的形式进行,但是太麻烦。 在开启root账户后,登陆可能会出现ttyname failed这种错误,解决办法也很简单。登陆root账户后,在控制台中输入gedit /root/.profile,修改/root/.profile文件。将其中的mesg n替换成tty -s && mesg n,保存重启即可。

最后再简单说一下如何修改GRUB的启动顺序和时间问题,也很简单。进入Ubuntu之后,打开终端,在终端中输入gedit /etc/default/grub,这样就打开GRUB的配置文件了,如下所示。 在其中找到GRUB_DEFAULT这个选项,这就是表示GRUB的默认启动项,在我的电脑中Windows在第三个,所以这里就设置为2(索引从0开始)。在下面还有GRUB_TIMEOUT选项,这就是表示等待时间了,默认为10秒,可以随意修改。修改完成后,记得保存。然后在终端中输入update-grub,就大功告成了。

关于实际双系统使用中时间不同步的问题,可以参考这篇博客进行设置。

2.设置系统镜像源

之所以要设置系统镜像,是因为系统自带的镜像源是国外的,速度很慢还有可能连不通。所以设置成国内的比较好。
1.打开系统设置,界面如下,找到”Software & Updates”。

2.点击打开,并且在Download from…下拉列表中找到China,在那些地址中随便选择一个都可以。比如我选择的是阿里云的镜像。 完成之后点击Choose Server。

3.把Downloadable中的所有项目都勾选上,最终完成的效果如下:

4.点击Close,系统会提示你是否需要重新加载资源。

5.点击Reload,系统会自动更新资源,等待完成即可。

3.安装aptitude

[可选步骤]aptitude是自动解决包依赖的工具,用于自动帮你分析应该安装什么版本以及提供最好的解决方案。它可以替代apt-get。当然你也可以选择不安装。不过鉴于后续要安装各种依赖,最好还是安装一下以备后患。如果apt-get安装时出现问题了,可以用aptitude试试看。安装aptitude的步骤也很简单。只需要打开终端,输入如下命令:sudo apt-get install aptitude 等待一会,即可安装完成。 关于aptitude的使用,后续如果用到再说。但需要注意的是在你用aptitude安装时,他会问你是否接受他的方案。第一个是默认保持现状的,所以你不能选Y(Yes)。否则什么都不会装。应该选择N(No)。这样aptitude才会执行安装。使用aptitude时要注意看他的提示语句。

还有个问题是,如果在使用apt-get命令的时候,如果出现”Unable to fetch some archives…“,如下图: 遇到这个问题先不要害怕,可以把同样的命令再输入一次,一般就好了。我遇到这个情况用这个方法基本都能解决。有时候一个包可能 装一次装不完,那就多装几次就可以了。 检测一个包是否安装完成的方法是把安装命令再输入一遍。如果提示你”0 upgraded , 0 newly installed , 0 to remove and xxx not upgraded.”,这就说明当前版本的包已经安装完成了。

至此,系统层面的相关内容就完成了。下面终于可以进入正题了。进行OpenCV的配置。

四、Ubuntu OpenCV环境搭建

要配置OpenCV环境,需要如下几步:

1.依赖库安装

依次执行以下命令安装依赖库:

sudo apt-get install build-essential  
  
sudo apt-get install cmake

sudo apt-get install cmake-gui
  
sudo apt-get install libgtk2.0-dev  
  
sudo apt-get install pkg-config  
  
sudo apt-get install python-dev

sudo apt-get install python-numpy
  
sudo apt-get install libavcodec-dev

sudo apt-get install libavformat-dev

sudo apt-get install libswscale-dev

sudo apt-get install libjpeg-dev

sudo apt-get install libpng-dev

sudo apt-get install libtiff-dev

sudo apt-get install libjasper-dev

一般第一个包系统都已经有了,安装系统会提示已安装(不过还是建议试一下,防止没安装)。装好libgtk2.0-dev后,一般pkg-config也装好了(可以用之前说的方法试试看)。依赖包比较多,你可以install后面跟多个一起装,但不太建议一次装太多,可能比较容易出问题。 同时如果你已经用root账户登陆了,就不需要sudo命令了,直接apt-get就好。在安装过程中还需要注意的是如果出现已经存在的包与需要安装的包版本不一致等等这种比较复杂的情况,建议使用aptitude安装。按照他的提示安装一般不会出现什么问题。

2.下载OpenCV源码

可以直接去OpenCV官网,然后找到Releases。点击“Sources”下载。之前我们在Windows下配置Python版本的OpenCV时,下载的是Win pack。如果想看如何配置Windows下Python版的OpenCV开发环境,可以看这篇博客 完成之后我们把下载的压缩包拷贝到虚拟机里。如果你不是登陆root账户,那么这一步你会发现拷贝不了。直接拖动或复制都可以。完成后解压到文件夹中(或者在电脑里解压好再拷到虚拟机里),如下所示:

3.编译源码

打开解压的目录,在空白处右键单击,选择启动终端,先用CMake生成Makefile。在终端依次输入mkdir build->cd build->cmake ..(注意不要漏了两个点)。然后就是等待完成。 其中”ICV: Downloading ippicv_linux_20151201.tgz…“这步比较慢,还有可能失败。 因为文件30多MB,算是比较大了,还是国外地址。所以如果在这步失败了,那么我们可以先事先下好这个文件, 然后再放到虚拟机中的”opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e”目录下。 点击这里下载。 漫长的等待后,出现如下所示提示,说明编译成功。 然后我们需要在控制台中输入”make“,进行下一步操作。再一次等待。编译过程截图如下。编译速度取决于你电脑的硬件配置。像我的电脑比较老,就会稍微慢点,编译了1个小时。 编译完成后,会有如下提示:Built target opencv_version

make完成后,最后执行”make install“。把刚刚编译好的东西安装到系统中,安装就比较快。 至此,源码的编译与安装就完成了。编译时可能会出现跟TIFF库有关的未引用异常,解决的办法是在cmake的时候加上一个参数-DBUILD_TIFF=ON。 错误详情可以参考这篇博客

4.添加路径

这类似于Windows中装完Java要在环境变量里添加PATH一样,为了让系统能够识别,需要做以下几步: 在终端中输入如下语句,打开这个文件:

sudo vim /etc/ld.so.conf.d/opencv.conf

在最后一行添加一句话”/usr/local/lib“,当然它也可能是空的,没关系。输入vim可能会提示你找不到命令,你只需要apt-get install vim,安装一下包再输入命令就可以了。或者如果你不会vim命令,那就直接按照路径/etc/ld.so.conf.d/去找,在该目录下新建一个opencv.conf文件,并且打开编辑,将”/usr/local/lib“添加进去,保存退出即可。
然后运行以下代码配置库:

sudo ldconfig

注意输入完后,什么都不会出现,只是类似于库配置完后刷新一下。然后再打开另一个文件:/etc/bash.bashrc。你可以选择用命令行sudo gedit /etc/bash.bashrc打开或者直接打开都可以。在文件末尾添加两行:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH

保存并关闭。至此,OpenCV的库就编译和安装完了。撒花~

[2021-02-08更新]

另外插一句题外话,Linux/Ubuntu下查看所有环境变量的命令是env,而查看某个指定的环境变量的命令是echo $NAME。例如想查看Path这个环境变量里都有哪些路径,直接输入echo $Path即可。

[更新结束]

五、Ubuntu OpenGL环境搭建

有了之前的基础,搭建OpenGL库就相对简单些了。至少不要再重头配置镜像了。

1.建立基本编译环境
sudo apt-get install build-essential

和OpenCV第一步一样,搭建基本编译环境,正常应该有,没有安装一下即可。

2.安装OpenGL Library
sudo apt-get install libgl1-mesa-dev

第一次安装可能会出现上面说的部分不成功的问题。解决办法就是再装一次就可以了。注意使用apt-get安装包是需要联网的。如果不联网是获取不到资源的。如果没办法联网,请参考前面说的解决方法。

3.安装OpenGL Utilities
sudo apt-get install libglu1-mesa-dev

OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函式,使 OpenGL 更强大且更容易使用。

4.安装OpenGL Utility Toolkit
sudo apt-get install libglut-dev 

上述代码有可能出现”Unable to locate package libglut-dev”的错误。这时候只需要将libglut-dev改成freeglut3-dev就可以了。

这样简单4步便完成了OpenGL的安装,比OpenCV好装多了。

六、Ubuntu SiftGPU编译

下面终于进入正题了,装了这么久OpenGL和OpenCV只是为了给这个做铺垫。因为它会用到这两个库。接下来继续。

1.安装glew

首先去官网下载glew的源码。然后将压缩包拷贝至虚拟机并解压。在该目录下开启终端。 如下所示: glew是用makefile直接编译的,不用cmake。所以我们直接输入”make“,进行编译。很快就编译好了。 然后输入”make install“进行安装。 这样glew便编译好了。
有个地方需要注意一下。注意看make install输出的信息。它默认把编译好的库文件libglew.so.2.0放在/usr/lib64下。 由于之后我们要用cmake去编,但是它可能找不到这个文件夹,所以我们现在先告诉系统,该文件夹下有要找的链接库。需要在终端中输入:”sudo ldconfig /usr/lib64/“便可以了。

2.编译SiftGPU

终于到了最核心,也是最后一步了。我们首先把SiftGPU的源码下载下来。它的作者的个人网页是这个,但悲剧的是不知道为什么现在访问不了了。 好在在Github上有SiftGPU的项目,点击查看,下载源码即可。 或者用我之前传到百度网盘的代码(时间比较久了,可能会有点老了),点击这里下载,密码是b7wz。
下载之后还是老样子,拷贝进虚拟机,解压,然后切换到该目录,在该目录下打开终端。 由于SiftGPU也是用Makefile编译的,所以直接在终端里输入”make”即可。如果顺利的话,编译到这就完成了,会在bin/目录里得到几个二进制和一个libsiftgpu.so库文件。我们主要使用这个库文件。但现在出现了问题如图所示: 提示如下:

/usr/bin/ld: cannot find -lIL
collect2: error: ld returned 1 exit status
makefile:175: recipe for target 'siftgpu' failed
make: *** [siftgpu] Error 1

说是找不到”-lIL”。百度了一下,“cannot find -lxxx”是linux编译时常见的问题。make时报“/usr/bin/ld: cannot find -lxxx”,是指编译过程找不到对应库文件,其中,-lxxx表示链接库文件libxxx.so。 发现这个问题后,我们就可以对症下药了。可以试试使用如下命令:apt-get install libIL。结果悲剧的是,在使用apt-get命令时又出现了问题。提示我操作中断。所以需要修复apt-get。如下图: 在网上找到的解决方案如下:

sudo rm /var/lib/dpkg/updates/*

sudo apt-get update

sudo apt-get upgrade

输入上述三行命令,可以解决问题。在修复好之后,继续执行包安装命令。发现apt-get并不能找到这个包。通过阅读SiftGPU的README可以发现。其中有这么一句话:

SiftGPU uses DevIl Image library, GLEW and GLUT. You'll need to make sure your system has
	all the dependening libraries.

对应刚刚我们的工作,可以发现GLEW、GLUT都已经安装好了。然而他还依赖了一个叫DevIl的库。我们发现这个库名刚好对应上面提示的IL。对于这个问题,我们可以有两种办法,一种是在makefile中屏蔽掉这个库,另一种是编译安装这个库。我们首先试简单的。在makefile中屏蔽它。

(1)屏蔽DevIL

直接在makefile中,将DevIL这个库给屏蔽掉,不使用它。如下图所示: “1”表示不使用,”0”表示使用。然后再次编译。但也有可能报错。可以发现报的错误还是跟IL有关,在代码中调用了DevIL的API,但是少库。 可能由于代码复杂的依赖,对于不包含IL的情况还不是很完美支持,所以屏蔽DevIL这条路应该是走不通了。这样我们就只能尝试编译DevIL库了。

(2)编译DevIL库

所以我们手动安装DevIL。打开官网,找到Download。在最下面有如下描述: 我们可以选择编译好的二进制文件,也可以选择源码。并且给出了如果编译源码,需要用到的依赖库。这里事先编译好的二进制文件我并不会用,所以选择源码自己编译。点击下载”DevIL 1.8.0.zip”压缩包。然后将其拷贝到虚拟机中,解压。进入对应目录,然后打开控制台。由于是使用Cmake编译的,所以首先要使用Cmake命令编译,否则会出现错误,如下图: 提示”make: *** No targets specified and no makefile found. Stop.”错误。 在控制台中输入”cmake .”,完成结果如下: 在完成cmake后,使用make命令进行编译,如下: 这里并没有提示我们缺少依赖什么的,很顺利,也很快。这应该与我们安装OpenCV时安装的那些依赖库有关,已经在那个时候装过了。仔细一看也确实是这样。他所依赖的这些库,都是与格式有关的,在前面已经安装了。在完成make后,便可以使用”make install“安装了,截图如下: 过程非常快。可以看到,安装的文件中便包含之前提示缺少的”libIL.so”。这样DevIL的编译与安装就完成了。可以回到主线去编译SiftGPU了。

(3)再编SiftGPU

回到SiftGPU目录,右键打开控制台。输入”make“。截图如下: 终于没有错误了!!有一些警告,不过这与我们无关,是源代码里的。我们可以在bin目录下找到生成的”libsiftgpu.so”。 这便是我们编译要获得的最终结果了。最后一步,我们需要看看这个库的链接信息是否正确。在控制台中输入”ldd bin/libsiftgpu.so”。如下所示: 可以发现所有的库都是链接正常的,没有出现”Not Found”的情况。”libGLEW”、”libIL”等都正常。尤其需要注意保证没有出现某个链接(特别是GLEW)没有找到的情况(否则这里会通过,但使用会出现undefined reference)。最后如果出现GLEW没有找到的情况,原因也正如前面分析,系统找不到它所在的路径,解决办法是在make之前,输入”ldconfig /usr/lib64/”,然后再编译就没问题了(当然前提是你已经正确安装GLEW了,不过能到这里,说明前面应该都是完成了的)。

这样,编译SiftGPU的所有步骤就完成了(痛哭流涕啊)!折磨了好几天,遇到了各种问题和困难,查了太多资料,踩了数不清的坑,终于编译完了!此刻的心情无比激动。这篇安装笔记也就到此结束了。希望可以帮到后续的孩子们,看到这篇笔记可以少走点弯路。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部