Windows (64bit)で Google Protobuf をビルドする

必要に迫られてWindows上なんぞで自前でビルドするはめに。バイナリ実行だけでいいならビルド済みのものをダウンロードすればよいが、ライブラリを使おうとするとビルドせにゃならない。Minicondaでインストール(libprotobuf-3.2.0)してパス通すだけではエラー吐いてリンクがうまくいかなかった(これが原因かも定かでない気もする)。

6/25 追記: どうも、Visual Studio でリンクしようとするとエラーがでるらしく、エラーを回避するためには自分でビルドする必要があったようだ。配布パッケージのcmake/libprotobuf.cmakeを編集する(最新版は編集済みだった)


以下をインストールしておく。

次に、ソースコードを以下のページからダウンロード。今回はC++でprotobufのライブラリを使いたいのでprotobuf-cpp-3.3.0.zipをダウンロードして、作業ディレクトリに展開。

Visual Studio 付属の開発コマンドプロンプトを起動。今回は64bitとしてビルドしたいが、のちのちコンパイルしたいコードに合わせて、x86_x64 cross tool(注1) を選択して起動。以下の公式ページの指示に従って、ビルド・インストール、できればよかったのだがすんなりはいかない。

以下のコマンドを実行した際、75%あたりでエラーがでる。

 C:\Path\to\protobuf\cmake\build>mkdir release & cd release
 C:\Path\to\protobuf\cmake\build\release>cmake -G "NMake Makefiles" ^
 -DCMAKE_BUILD_TYPE=Release ^
 -DCMAKE_INSTALL_PREFIX=../../../../install ^
 ../..

まじかお、って感じだが、超困る。ここでちょうど数日前に書かれた記事(http://sgry.jp/blog/2017/06/17/4676/)を発見。この記事によると、Protocol Buffers 3.3.0に付属する単体テストのソースの一部にはUTF-8としても不正なデータ列が含まれており、不正なデータを拒否する処理が正しく行われるかをテストすらしい。ところが、日本語環境ではVisual StudioがShift JIS としてソースファイルを扱うために、不正なデータ列を処理する段階でエラーを吐くらしい、ガッデム。
仕方がないので、cmakeの前に

set _CL_=/utf-8

として、コンパイルオプションにUTF-8として処理するように設定を行えばよいらしい。実際この1行を追加したらnmakeは通った。

最後に以下を実行すれば、bin, include, lib, の3つのディレクトリが作られるので、パスに追加すればよい。

nmake install

注1: GUIのCMakeでVisual Studio 14 2015 64bit を選択すると x86_x64を選択してしまうので、統一しておいただけ・・・。