はじめに (対象読者・この記事でわかること)

本記事は、Windows 環境で C++ 開発を行っている方、特に機械学習ライブラリをネイティブに組み込みたいエンジニアを対象としています。Windows 標準の Visual Studio だけでなく、軽量な mingw-w64 + g++ 環境でも TensorFlow の C++ API をビルドしたいというニーズに応える内容です。この記事を読むと、以下が実現できます。

  • MinGW‑w64 と Bazel を用意し、TensorFlow ソースから C++ ライブラリ(libtensorflow_cc など)をビルドする手順が分かる
  • ビルド時に遭遇しやすいエラーとその対処法を把握できる
  • ビルド済みバイナリを自分の C++ プロジェクトに組み込む具体的な方法が理解できる

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • 基本的な C++ 開発経験(コンパイル・リンクの概念が分かる)
  • Windows のコマンドライン操作(PowerShell または Git Bash)
  • Git の基本操作とリポジトリのクローン方法
  • Bazel の概念(ビルドツールとしての位置付け)

TensorFlow C++ API の概要と Windows ビルドが必要な背景

TensorFlow は主に Python 用の高水準 API が提供されていますが、実際の製品や組み込みシステムでは C++ でモデルを直接呼び出すケースが増えています。公式は Linux/macOS 向けのビルド手順を充実させていますが、Windows でのサポートは限定的です。そのため、mingw-w64 + g++ という軽量コンパイラ環境でビルドできるノウハウは、開発コスト削減とビルド時間短縮に直結します。特に以下のようなシーンで有用です。

  • Windows の既存 CI 環境に C++ ビルドを統合したい
  • Visual Studio の heavy なツールチェーンを回避し、軽量なスクリプトベースでビルドしたい
  • クロスコンパイルや Docker コンテナ内でのビルドを行う際に、同一の g++ コンパイラを使い回したい

本稿では、これらの背景を踏まえて「MSYS2 + mingw-w64 + Bazel」という組み合わせで TensorFlow C++ API をビルドする具体的な手順を示します。

TensorFlow C++ API を Windows (mingw-w64, g++) でビルドする手順

ステップ 1 : 開発環境のインストール

  1. MSYS2 のインストール
    - https://www.msys2.org/ からインストーラをダウンロードし、C:\msys64 に展開して実行。
    - 初回起動後、パッケージデータベースを更新するために以下を実行
    bash pacman -Syu # 初回は再起動が必要 pacman -Syu # 再起動後に再度
  2. mingw-w64 と g++ の導入
    bash pacman -S mingw-w64-x86_64-toolchain # C/C++ コンパイラとリンカ pacman -S mingw-w64-x86_64-bazel # Bazel の公式パッケージ 上記で g++, gcc, ld, bazel$PATH に自動追加されます。PowerShell でも同様に動作させるため、C:\msys64\mingw64\bin をシステム環境変数 PATH に追加しておきましょう。

  3. Git のインストール(任意)
    bash pacman -S git

ステップ 2 : TensorFlow ソースコードの取得

Bash
mkdir -p C:\tensorflow_src cd C:\tensorflow_src git clone https://github.com/tensorflow/tensorflow.git cd tensorflow git checkout r2.16 # 安定版タグを指定(必要に応じて変更)

ソースコード取得後、tensorflow ディレクトリ直下に WORKSPACE と多数の BUILD ファイルが存在します。これらは Bazel がビルド情報を参照するために必要です。

ステップ 3 : Bazel の設定

.bazelrc の作成

Windows + mingw-w64 用のビルドフラグを .bazelrc に記述します。tensorflow/.bazelrc が既に存在しますが、以下のオーバーライドを追加するとビルドが安定します。

Ini
build --config=windows build --cxxopt=-std=c++14 build --host_cxxopt=-std=c++14 build --compiler=gcc build --host_compiler=gcc build --linkopt=-static-libgcc build --linkopt=-static-libstdc++ build --crosstool_top=@bazel_tools//tools/cpp:toolchain

Bazel のバージョン確認

TensorFlow r2.16 は Bazel 5.x 系を推奨しています。バージョンが合わないとビルドエラーになるので、以下で確認・インストールしてください。

Bash
bazel --version # 例: 5.4.0 # 必要ならばバージョンダウングレード pacman -S mingw-w64-x86_64-bazel=5.4.0-1

ステップ 4 : 実際のビルド

C++ API のみをビルドしたい場合は //tensorflow:libtensorflow_cc ターゲットを指定します。

Bash
bazel build -c opt --config=windows //tensorflow:libtensorflow_cc
  • -c opt は最適化ビルド
  • --config=windows は先ほど .bazelrc の設定を有効化

ビルドが正常に完了すると、以下の場所に成果物が生成されます。

bazel-bin\tensorflow\libtensorflow_cc.dll
bazel-bin\tensorflow\libtensorflow_cc.lib

ステップ 5 : ビルド成果物の利用

  1. ヘッダファイルの配置
    tensorflow\include ディレクトリ以下のヘッダを自プロジェクトの include パスにコピーします。

  2. ライブラリリンク
    g++ でビルドする場合、以下のオプションを追加
    bash -Ipath\to\include -Lpath\to\lib -ltensorflow_cc -ltensorflow_framework

  3. サンプルコード実行
    ```cpp #include "tensorflow/cc/client/client_session.h" #include "tensorflow/cc/ops/standard_ops.h"

int main() { using namespace tensorflow; using namespace tensorflow::ops; Scope root = Scope::NewRootScope(); auto A = Const(root, {{1.0, 2.0}, {3.0, 4.0}}); auto B = Const(root, {{5.0, 6.0}, {7.0, 8.0}}); auto C = MatMul(root.WithOpName("C"), A, B); ClientSession session(root); std::vector outputs; TF_CHECK_OK(session.Run({C}, &outputs)); std::cout << outputs[0].matrix() << std::endl; return 0; } `` 上記をg++ sample.cc -I -L -ltensorflow_cc -ltensorflow_framework -o sample.exe` でビルドし、実行すれば行列演算結果が表示されます。

ハマった点やエラー解決

発生したエラー 主な原因 解決策
undefined reference to__imp__ZSt4cout| MinGW のスタティックリンク設定が不足 |--linkopt=-static-libstdc++.bazelrc` に追加
ERROR: /usr/bin/ld: cannot find -ltensorflow_framework ライブラリパスが通っていない bazel-bin\tensorflowLIB 環境変数に追加、または -L オプションで明示
Bazel: command not found MSYS2 の PATH が PowerShell に反映されていない C:\msys64\usr\binC:\msys64\mingw64\bin をシステム PATH に永久追加
java.lang.UnsupportedClassVersionError Bazel が内部で使用する Java のバージョンが古い choco install openjdk11 で最新の JDK をインストールし、JAVA_HOME を更新

解決策のポイント

  • 環境変数の一元管理:MSYS2 の bin ディレクトリを Windows のシステム PATH に追加すれば、PowerShell・CMD どちらでも同じコマンドが利用できる。
  • Bazel のキャッシュクリア:エラーの再現性が不明な場合は bazel clean --expunge を実行し、ビルドキャッシュをリセットする。
  • バージョン固定:TensorFlow・Bazel の組み合わせは相性が重要です。公式の BUILD ファイルが要求するバージョンを必ず確認し、pacman でバージョンを固定してください。

まとめ

本記事では、Windows 環境で MinGW‑w64 + g++ を用いて TensorFlow C++ API をビルドする手順 を、開発環境の構築から実際のビルド、エラー対処まで一連の流れで解説しました。

  • MinGW‑w64 と Bazel を MSYS2 からインストールし、PATH を整備したこと
  • TensorFlow ソースを取得し、.bazelrc に Windows 用のビルドフラグを設定したこと
  • bazel build //tensorflow:libtensorflow_cc で C++ ライブラリを生成し、プロジェクトへ組み込む方法

これにより、Visual Studio に依存せず軽量なツールチェーンで TensorFlow のネイティブ C++ API を活用できるようになります。次回は、生成したライブラリを用いた マルチスレッド推論 の実装例を紹介する予定です。

参考資料