RedhatシステムにProtobufをインストールする

6291 ワード

このドキュメントには、リモートサーバTesla K 80 RedhatシステムにProtobufをインストールする手順が記載されています.
ここからprotobuf-3.2.0を降りました.tar.gz.
# tar zxvf protobuf-3.2.0.tar.tgz
# cd protobuf-3.2.0/
# ./configure
checking whether to enable maintainer-specific portions of Makefiles... yes
checking build system type... x86_64-unknown-linux-gnu
......................
configure: creating ./config.status
config.status: creating Makefile
config.status: creating scripts/gtest-config
config.status: creating build-aux/config.h
config.status: executing depfiles commands
config.status: executing libtool commands
# make
make all-recursive
......................
make[2]: ***[google/protobuf/any.pb.lo] Error 1
make[2]: Leaving directory '/root/K80/protobuf-3.2.0/src'
make[1]: ***[all-recursive] Error 1
make[1]: Leaving directory '/root/K80/protobuf-3.2.0'
make: *** [all] Error 2

インターネットで調べてみるとautogenという人がいました.shちょっと走ってみます.
# ./autogen.sh
./autogen.sh: line 48: autoreconf: command not found

Autoreconfがインストールされていないことを発見し、autoreconf、automake、libtoolの3つのパッケージをインストールします.

Step 1 autoreconfをインストールし、ここからダウンロードする

# tar zxvf autoconf-2.69.tar.gz
# cd autoconf-2.69/
# ./configure
# make
# make install

Autoconfのインストールに成功したことを検出します.
# autoconf --version
autoconf (GNU Autoconf) 2.69
...
...
...

Step 2 automakeをインストールし、ここからダウンロードする

# tar zxvf automake-1.14.tar.gz
# cd automake-1.14/
# ./configure
# make
# make install

Automakeのパスとバージョンを表示します.
# which auautomake
/usr/local/bin/automake
# automake --version
automake (GNU automake) 1.14

Step 3 libtoolをインストールし、ここからダウンロードする

# tar -xzf libtool-2.4.2.tar.gz
# cd libtool-2.4.2
# ./configure
# make
# make install
# make check

Autogenを再実行します.sh:
# ./autogen.sh
# ./configure --prefix=/usr/local/protobuf
# make
'google::protobuf::internal::InternalMetadataWithArena::InternalMetadataWithArena(google::protobuf::Arena*)':
./google/protobuf/metadata.h:175: error: class 'google::protobuf::internal::InternalMetadataWithArena' does not have any field named 'InternalMetadataWithArenaBase'
./google/protobuf/metadata.h: In constructor 'google::protobuf::internal::InternalMetadataWithArenaLite::InternalMetadataWithArenaLite(google::protobuf::Arena*)':
./google/protobuf/metadata.h:204: error: class 'google::protobuf::internal::InternalMetadataWithArenaLite' does not have any field named 'InternalMetadataWithArenaBase'
make[2]: *** [google/protobuf/any.pb.lo] Error 1
make[2]: Leaving directory /home/protobuf/src' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory/home/protobuf'
make: *** [all] Error 2

以上のエラーはgoogleのバグで、#2559で修正されていますが、releaseでは変更されていない可能性がありますので、手動で変更してください.
# cd /src/google/protobuf/
# vim metadata.h

metadata.hで次の変更を行います.
 public:
    InternalMetadataWithArena() {}
    explicit InternalMetadataWithArena(Arena* arena)
 -      : InternalMetadataWithArenaBase(arena) {}
 +      : InternalMetadataWithArenaBase(arena) {}

    void DoSwap(UnknownFieldSet* other) {
      mutable_unknown_fields()->Swap(other);
 @@ -201,7 +202,8 @@ class InternalMetadataWithArenaLite
    InternalMetadataWithArenaLite() {}

    explicit InternalMetadataWithArenaLite(Arena* arena)
 -      : InternalMetadataWithArenaBase(arena) {}
 +      : InternalMetadataWithArenaBase(arena) {}

    void DoSwap(string* other) {
      mutable_unknown_fields()->swap(*other);

再make:
# make
# make install