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

この記事は、C++でネットワークプログラミングを行いたい開発者、特にZeromqという高性能メッセージングライブラリを利用したシステムを構築したい方を対象としています。この記事を読むことで、ZeromqをC++環境でビルドする方法、基本的な使い方、そしてビルド中に遭遇する可能性のある問題とその解決策を学ぶことができます。最近、分散システムの開発に取り組んでおり、Zeromqの導入時にいくつかのハードルを感じた経験から、この記事を執筆しました。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - C++の基本的な知識 - コンパイラとビルドシステム(makeやCMake)の基本的な理解 - Linux環境での基本的なコマンド操作

Zeromqとは:高性能メッセージングライブラリの概要

Zeromq(ZeroMQ)は、軽量で高性能なメッセージングライブラリであり、伝統的なメッセージングシステム(JMSやAMQPなど)よりもシンプルで高速な通信を実現します。TCP、UDP、IPC、TCPなど、複数のトランスポートプロトコルをサポートしており、パブリッシュ/サブスクライブ、リクエスト/レスポンス、パイプライン、リクエスト/ディスパッチなどのパターンを提供します。

C++でZeromqを利用するには、まずライブラリをビルドする必要があります。公式サイトからソースコードを取得し、コンパイルしてインストールする手順が一般的です。Zeromqはクロスプラットフォーム対応しており、Linux、macOS、Windowsなど主要なOSで利用可能です。

この記事では、Linux環境を例にZeromqのビルド手順を解説します。Zeromqのビルドには、依存関係としていくつかのライブラリが必要になる場合があるため、事前に準備が必要です。

Zeromqのビルド手順

ステップ1:依存関係のインストール

Zeromqをビルドする前に、必要な依存関係をインストールします。Ubuntu/Debian系のディストリビューションでは、以下のコマンドで必要なパッケージをインストールできます。

Bash
sudo apt-get update sudo apt-get install -y build-essential git autoconf automake libtool pkg-config

これにより、C++コンパイラ、ビルドツール、Zeromqのビルドに必要なツールがインストールされます。

ステップ2:ソースコードのダウンロード

Zeromqの公式リポジトリからソースコードをクローンします。ターミナルで以下のコマンドを実行します。

Bash
git clone https://github.com/zeromq/libzmq.git cd libzmq

最新の安定版をビルドしたい場合は、タグを指定して特定のバージョンをチェックアウトすることも可能です。

Bash
git checkout v4.3.4 # 例:バージョン4.3.4を指定

ステップ3:ビルド環境の準備

ZeromqはAutotoolsを使用してビルド環境を構築します。以下のコマンドでビルド環境を準備します。

Bash
./autogen.sh

このコマンドは、ビルドに必要なconfigureスクリプトを生成します。初回実行時には、依存関係が不足している場合があります。その場合は、不足しているパッケージを追加でインストールしてください。

ステップ4:ビルドとインストール

ビルド環境の準備が完了したら、以下のコマンドでビルドとインストールを行います。

Bash
./configure make sudo make install

./configureコマンドは、ビルド環境をチェックし、ビルドオプションを設定します。デフォルトの設定で問題ない場合は、オプションを指定せずに実行します。特殊な要件がある場合は、./configure --helpで利用可能なオプションを確認してください。

makeコマンドで実際にビルドが行われ、sudo make installでシステムにライブラリがインストールされます。インストール先はデフォルトでは/usr/localディレクトリになります。

ステップ5:動作確認

インストールが完了したら、簡単なテストプログラムを作成して動作を確認します。以下の内容でtest_zmq.cppというファイルを作成します。

Cpp
#include <zmq.hpp> #include <string> #include <iostream> int main() { // 1. コンテキストの作成 zmq::context_t context(1); // 2. ソケットの作成 zmq::socket_t socket(context, ZMQ_REP); socket.bind("tcp://*:5555"); std::cout << "Zeromqサーバーがポート5555で待機中..." << std::endl; // 3. メッセージの受信 zmq::message_t request; socket.recv(request, zmq::recv_flags::none); std::cout << "受信: " << request.to_string() << std::endl; // 4. メッセージの送信 std::string reply = "Hello from Zeromq"; zmq::message_t reply_msg(reply.size()); memcpy(reply_msg.data(), reply.c_str(), reply.size()); socket.send(reply_msg, zmq::send_flags::none); return 0; }

このプログラムをコンパイルするには、以下のコマンドを実行します。

Bash
g++ -std=c++11 test_zmq.cpp -o test_zmq -lzmq

コンパイルが成功したら、実行して動作を確認します。

Bash
./test_zmq

プログラムが正常に実行され、"Zeromqサーバーがポート5555で待機中..."というメッセージが表示されれば、ビルドとインストールは成功しています。

ハマった点やエラー解決

エラー1:autogen.shの実行に失敗する

エラーメッセージ例:

autogen.sh: line 2: autoreconf: command not found

原因: autogen.shを実行する前に、autoconf、automake、libtoolなどのツールがインストールされていない場合に発生します。

解決策: 以下のコマンドで必要なツールをインストールします。

Bash
sudo apt-get install -y autoconf automake libtool

エラー2:コンパイル時に"zmq.hpp"が見つからない

エラーメッセージ例:

fatal error: zmq.hpp: そのようなファイルやディレクトリはありません

原因: Zeromqのヘッダファイルがシステムの標準パスに存在しない場合に発生します。

解決策: Zeromqのインストール時にパスが正しく設定されていない可能性があります。以下のいずれかの方法で解決できます。

  1. ヘッダファイルのパスを明示的に指定してコンパイル:
Bash
g++ -std=c++11 -I/usr/local/include test_zmq.cpp -o test_zmq -L/usr/local/lib -lzmq
  1. 環境変数LD_LIBRARY_PATHを設定:
Bash
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  1. /etc/ld.so.conf.d/に設定ファイルを作成:
Bash
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/local.conf sudo ldconfig

エラー3:実行時に"libzmq.so.5: cannot open shared object file"

エラーメッセージ例:

./test_zmq: error while loading shared libraries: libzmq.so.5: cannot open shared object file: No such file or directory

原因: 共有ライブラリのパスがシステムに設定されていない場合に発生します。

解決策: 以下のいずれかの方法で解決できます。

  1. 環境変数LD_LIBRARY_PATHを設定:
Bash
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  1. /etc/ld.so.conf.d/に設定ファイルを作成:
Bash
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/local.conf sudo ldconfig

エラー4:C++11以降の機能を使用している場合のコンパイルエラー

エラーメッセージ例:

error: 'to_string' is not a member of 'zmq::message_t'

原因: 古いバージョンのZeromqでは、C++11以降の機能がサポートされていない場合があります。

解決策: Zeromqのバージョンを最新にアップグレードするか、C++11以降の機能を使用しないコードに修正します。バージョンアップが必要な場合は、以下の手順で最新版をビルドします。

Bash
cd libzmq git pull origin master git checkout $(git describe --tags `git rev-list --tags --max-count=1`) ./autogen.sh ./configure make sudo make install

まとめ

本記事では、ZeromqをC++環境でビルドする手順とトラブルシューティングについて解説しました。

  • 依存関係のインストールからソースコードのビルド、インストールまでの基本的な手順
  • 簡単なテストプログラムによる動作確認方法
  • ビルドや実行中に遭遇する可能性のある問題とその解決策

この記事を通して、ZeromqをC++環境で利用するための基本的な知識と実践的なスキルを身につけることができたと思います。Zeromqは、分散システムやマイクロサービスアーキテクチャを構築する上で非常に強力なツールです。今後は、Zeromqを利用した具体的なアプリケーション開発についても記事にする予定です。

参考資料