最近有个项目要在MATLAB中使用vlfeat,在编译安装的时候又踩了不少坑。在此分享一下。
1.源码安装gcc-6.3
参考:
[1]https://www.w3xue.com/exp/article/20191/16725.html
[2]https://blog.csdn.net/XCCCCZ/article/details/80958414
[3]https://blog.csdn.net/futangxiang4793/article/details/88660550
[4]https://www.ph0en1x.space/2018/04/23/ubuntu_vlfeat/
因为vlfeat只能用gcc-6.3编译,但是ubuntu18.04里默认的gcc6版本是6.5。所以只能手动安装。
安装gcc之前需要安装gmp,mpfr,mpc,isl这几个库。参考[1]里讲的很清楚。但是也有几个需要注意的地方。
安装这些库的时候最好用gcc>5.0的版本。有一个库好象是isl需要使用>5.0的gcc安装,否则会报错。
(1)安装gmp
下载地址:https://gmplib.org/
- $cd gmp-6.1.2/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/gmp-6.1.2
- $ make -j12
- $ sudo make install
[问题一]:
在安装gmp之后,在安装isl时出现了cannot find gmp.h错误,但是查看相应的路径/usr/local/gmp-6.1.2/include/gmp.h,明明是已经存在的。
[解决方法]:
执行了下列命令就好了,但是不知道为什么。
$ sudo apt install libgmp-dev
(2)安装mpfr
- $cd mpfr-4.0.2/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/mpfr-4.0.2 --with-gmp=/usr/local/gmp-6.1.2
- $ make -j12
- $ sudo make install
(3)安装mpc
下载地址:http://www.multiprecision.org/mpc/
- $ cd mpc-1.1.0/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/mpc-1.1.0 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2
- $ make -j12
- $ sudo make install
(4)安装isl
下载地址:http://isl.gforge.inria.fr/
- $ cd isl-0.18/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/isl-0.18 --with-gmp=/usr/local/gmp-6.1.2
- $ make -j12
- $ sudo make install
[问题二]:
这里遇到的问题就是,isl最新的版本已经出到了0.22,于是刚开始下载安装的是0.22的版本,但是出现了以下错误
gcc statistics.h GATHER_STATISTICS20must defined
在网上查了说可能是isl-0.22冲突的问题
[解决方法]:
卸载了isl-0.22,安装isl-0.18就好了。
(5)安装gcc-6.3
下载地址:https://ftp.gnu.org/gnu/gcc/gcc-6.3.0/
安装前先编辑好环境变量:
- $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.1.0/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-4.0.2/lib:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lis/x86_64-linux-gnu
然后再安装:
- $ cd gcc-6.3.0/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/gcc-6.3 --disable-multilib --with-system-zlib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2 --with-mpc=/usr/local/mpc-1.1.0 --with-isl=/usr/local/isl-0.18
- $ make -j12
- $ sudo make install
[问题三]:
这一步很多博主说,要执行sudo update-alternatives --remove-all gcc来卸载旧的gcc。但是这样会出现make的时候找不到编译器的问题:
no acceptable C compiler found in $PATH
[解决方法]:
不卸载gcc,gcc是可以多版本共存的。事实证明没卸载也安装成功了。
[问题四]:
make的过程中,出现了如下错误:
error: dereferencing pointer to incomplete type 'struct ucontext'
sc = (struct sigcontext *)(void *) &uc_->uc_mcontext);
[解决方法]:
找到出错的源代码,把 struct ucontext * uc_ = context->cfa 改成 struct ucontext_t * uc_ = context->cfa 再make就可以了。
[问题五] :
同样是make过程中报的错
aggregate ‘sigaltstack handler_stack’ has incomplete type and cannot be defined
struct sigaltstack handler_stack;
这是由于libsanitier跟最新的glibc冲突了。
[解决方法] :
https://reviews.llvm.org/D35246
照着上面的网站把
*libsanitizer/sanitizer_common/sanitizer_linux.h
*libsanitizer/sanitizer_common/sanitizer_linux.cc
*libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
*libsanitizer/tsan/tsan_platform_linux.cc
四个文件源代码改了就好了。
[问题六]:
编译的时候出现
This configuration is not supported in the following subdirectories:
[解决方法]:
https://stackoverflow.com/questions/29981492/gcc-4-9-2-installation-failed-on-linux
这里把除了LD_LIBRARY_PATH之外的环境变量全部置空,就可以了。有博主说要把LD_LIBRARY_PATH也置空,但是我试了之后出现了找不到上面安装的库的问题。
$ export $C_INCLUDE_PATH=
$ export $CPLUS_INCLUDE_PATH=
$ export $LIBRARY_PATH=
[问题七]:
编译的时候还遇到了如下问题:
recipe for target 'all-recursive' failed
[解决办法]:
这个实际上是由问题五引起的。由于编译输出太长,最后只能看到这个信息。但是实际的报错信息在中间部分。建议最好下一个高亮插件,比较容易找到错误。
(6)替换gcc
- $ cd /usr/bin
- $ sudo rm gcc g++
- $ sudo ln -s /usr/local/gcc-6.3/bin/gcc gcc
- $ sudo ln -s /usr/local/gcc-6.3/bin/g++ g++
再用gcc -v 和g++ -v查看一下版本,如果版本对就没问题了。
2.安装vlfeat-matlab
终于到了第二步了,gcc源码编译真的麻烦...... vlfeat还是比较简单的。
下载地址:http://www.vlfeat.org/download.html
注意:有的博客说直接在matlab命令行运行vl_setup就可以。但是那样会出现以下错误
Warning: Name is nonexistent or not a directory: ..\Adv. 3D Computer Vision\vlfeat\toolbox\mex\mexw32
这是因为vlfeat直接在matlab中编译只支持windows.在ubuntu下要用makefile来编译。
(1)安装vlfeat
有博主说要先修改makefile。添加或者注释一行DISABLE_OPENMP=yes。但是我查看官网后发现,如果是苹果系统才要添加这一句。如果是matlab+ubuntu支持不需要。
首先添加环境变量。打开/etc/ld.so.conf添加一行
vlfeat_ROOT/toolbox/mex/mexa64
再刷新环境配置
$ sudo ldconfig
最后再编译
- $ cd vlfeat_ROOT
- $ make MEX=matlab_ROOT/bin/mex CC=gcc
编译成功后进入matlab命令行输入
run('vlfeat_ROOT/toolbox/vl_setup.m')
运行好之后输入vl_version来检测。如果有输出版本就是装好了。
[问题一]:
编译的时候报错
command not found cc, make error
[解决方法]:
这是由于系统找不到编译器引起的。虽然之前已经安装了gcc-6.3并且gcc -v也成功输出了。可能是路径问题引起的。所以在make时指定编译器
make CC=gcc
[问题二]:
执行make的时候出现了如下问题:
toolbox/mexutils.h:175:10: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void
[解决方法]:
查看这段代码之后发现,这部分是用于减少gcc编译过程中的undefined symbol问题。直接注释掉这段代码解决了这个问题。
[问题三]:
编译完成并且matlab执行vl_setup后,执行vl_version时出现了这个问题
error while loading shared libraries: libvl.so
[解决方法]:
发现是ld.so.conf路径添加错了,改过来就好了。在bashrc中设置LD_LIBRARY_PATH应该也能解决这个问题。