Introduction

spotify が公開している、近似最近傍探索ライブラリ Annoy (Approximate Nearest Neighbors Oh Yeah) というがあるが、こいつを CentOS7 出ビルドしようとしたら

/opt/data/FaceRecognitionDotNet/src/Searches/AnnoySearch/../annoy/src/annoylib.h:68:24: fatal error: shared_mutex: No such file or directory

みたいなエラーが出てしまった。

結論から言えば、C++ 14 が必要であり、CentOS 7 でインストールできる gcc のバージョンが古かったのが原因。

gcc 5 をインストールすればいいよって話なんだが、ぐぐってみつかるのが

1
2
3
$ yum install -y centos-release-scl
$ yum install -y devtoolset-4
$ scl enable devtoolset-4 bash

みたいなコマンド。

でも、Devtoolset-4 にあるように、すでに EOL になっておりインストールできない。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ yum install -y centos-release-scl
$ yum install -y devtoolset-4
No package devtoolset-4 available.
Error: Nothing to do

$ yum search devtoolset |grep devtoolset|awk {'print $1'} |cut -f 1,2 -d\-|sort|uniq
===========================
devtoolset-10
devtoolset-10.x86_64
devtoolset-11
devtoolset-11.x86_64
devtoolset-7
devtoolset-7.x86_64
devtoolset-8
devtoolset-8.x86_64
devtoolset-9
devtoolset-9.x86_64

なので、gcc を自分でビルドしよう、という話。

How to build?

事前に yum groupinstall -y "Development Tools" とかで最低限ビルドに必要なものはインストール済みであるものとする。
なお、wget と bzip2 が追加で必要。
下記のコマンドで一発。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cd /opt
$ wget http://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz && tar -xvf gcc-5.4.0.tar.gz && rm gcc-5.4.0.tar.gz
$ cd gcc-5.4.0
$ ./contrib/download_prerequisites
$ mkdir build && cd build
$ ../configure -prefix=/usr/local --enable-checking=release --enable-languages=c,c++ --disable-multilib
$ make && make install

$ gcc --version
gcc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

configure の際、オプションの有無で苦労した。

configure: error: I suspect your system does not have 32-bit developement libraries (libc and headers). If you have them, rerun configure with –enable-multilib. If you do not have them, and want to build a 64-bit-only compiler, rerun configure with –disable-multilib.

とか

checking dynamic linker characteristics… configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES.

ね。

使うときは

1
2
export CMAKE_C_COMPILER=/usr/local/bin/gcc
export CMAKE_CXX_COMPILER=/usr/local/bin/g++

みたいにすれば良いと思う。