POCO C++ Libraries の簡単な使用方法
[履歴] [最終更新] (2015/05/28 23:47:36)

概要

POCO (POrtable COmponents) は Boost と同様に有用な C++ のクラスライブラリです。簡単に使用方法を記載します。Boost Software License で配布されていますが Boost への明示的な依存はなく単体で動作します。

A Guided Tour Of The POCO C++ Libraries

Poco::Any class (based on boost::Any)

とあることから poco のバイナリをビルドする際に boost のバイナリが静的にリンクされているのかもしれません。

インストール

こちらから選択します。すべてソースコードであり後にビルドが必要です。今回は Basic Edition を利用します。GCC でビルドするため "Sources for Linux, OS X, etc." を選択します。

Linux の場合

事前に gcc-c++ などをインストールしてから以下のコマンドを実行します。

$ tar zxvf poco-1.6.0.tar.gz
$ cd poco-1.6.0/
$ ./configure
$ make
$ sudo make install

既定では以下の場所にインストールされます。

  • /usr/local/include/Poco/* (ヘッダーファイル)
  • /usr/local/lib/libPoco*.so (動的リンク用ライブラリ SharedObject)

Windows の場合

いくつか方法がありますが Linux の場合とビルド環境を近づけるために 3 番目の「Cygwin の GCC でビルド」を採用します。

  • "Sources for Windows" をダウンロードして Visual Studio でビルド
  • Cygwin Poco パッケージをマネージャからダウンロードしてそのまま利用
  • "Sources for Linux, OS X, etc." を Cygwin の GCC でビルド (Cygwin の Poco パッケージはインストール済みであればアンインストール)

Eclipse のプロジェクトを作成

こちらを参考に CDT プラグインを利用して C++/実行可能/空プロジェクトを作成します。ツールチェーンには Cygwin GCC を選択します。

ソースコードの解凍および Poco のビルド

ダウンロードしたソースコードをプロジェクトのエクスプローラ内にドラッグアンドドロップしてコピーします。Cygwin Terminal で以下のコマンドを実行します。make install は実行しません。CPU のコアが複数個ある場合は make -j4 で Job 数を増やすことで並列化できるため高速にビルドできます。プロジェクトによっては並列ビルドすると不具合が発生することがありますが Poco プロジェクトについては問題なくビルドできます。

$ cd /path/to/workspace/プロジェクト名
$ tar zxvf poco-1.6.0.tar.gz
$ cd poco-1.6.0/
$ ./configure
Configured for CYGWIN
$ make
(or $make -j4)

Eclipse のエクスプローラ内で F5 を押すなどしてリフレッシュすると展開およびビルドしたファイルが認識されます。poco-1.6.0 のフォルダを右クリックして「リソース構成」→「ビルドから除外」→「Debug,Release」→「OK」としておきます。

インクルードパスとライブラリーパスの設定

インクルードパス

「プロジェクトのプロパティ」→「C/C++ 一般」→「パスおよびシンボル」→「インクルード」→「追加」→「ワークスペース /poco/poco-1.6.0/Foundation/include (ライブラリーが増える度に適宜追加)」→「すべての構成に追加 (Debug,Release)」→「すべての言語に追加 (GNUC,GNUC++,アセンブリー)」→「OK」

ライブラリーパス

「プロジェクトのプロパティ」→「C/C++ 一般」→「パスおよびシンボル」→「ライブラリーパス」→「追加」→「ワークスペース /poco/poco-1.6.0/lib/CYGWIN/i686」→「すべての構成に追加 (Debug,Release)」→「OK」

ライブラリーの追加

「プロジェクトのプロパティ」→「C/C++ 一般」→「パスおよびシンボル」→「ライブラリ」→「追加」→「PocoFoundation と入力 (後述の -l オプションに相当、使用ライブラリーが増える度に適宜追加します)」→「すべての構成に追加 (Debug,Release)」→「OK」

実行時の構成を設定

以上の設定でビルドまでは成功しますが、バイナリを実行すると失敗します。Eclipse 上ではエラーなく失敗するため気付きにくいですが Cygwin Terminal で実行すると原因が判明します。

$ ./poco.exe
/cygdrive/c/Users/username/workspace/poco/Debug/poco.exe: error while loading shared libraries:
cygPocoFoundation.30.dll: cannot open shared object file: No such file or directory

DLL が見つからないためエラーが出ています。後述の通り Linux 環境では LD_LIBRARY_PATH にパスを追加すればよいのですが Windows では PATH 環境変数に DLL へのパスを追加します。

「プロジェクトのプロパティ」→「実行/デバッグ設定」→「新規 (または "プロジェクト名.exe" が既にあればそれを編集)」→「C/C++ Application」→「OK」→「環境」→「選択」→「Path,PATH,path など OS の環境変数を選択」→「OK」→「選択して編集」→「先頭に DLL へのパスをセミコロン区切りで追記 (例: c:/Users/username/workspace/プロジェクト名/poco-1.6.0/lib/CYGWIN/i686)」→「ネイティブ環境を指定の環境と置換 (OS の環境変数を実行時に上書きます)」→「OK」→「OK」

実行

以下の正規表現のソースコードをビルドおよび実行してみましょう。

  • 「エクスプローラを右クリック」→「新規」→「ソース・フォルダー」→「フォルダ名 src」→「完了」
  • 「エクスプローラを右クリック」→「新規」→「ソース・ファイル」→「ソース・ファイル名 Main.cpp」→「完了」
  • 実行時の構成を先程設定した項目 "プロジェクト名.exe" で実行

正規表現 (動作検証を兼ねて)

Poco/RegularExpression の使用例です。

sample.cpp

#include <iostream>
#include <Poco/RegularExpression.h>

int main() {
    Poco::RegularExpression regexp("^[a-zA-Z]+");

    std::string buf;
    regexp.extract("ABC123", buf);
    std::cout << buf << std::endl; //=> ABC

    return 0;
}

ビルド例

$ g++ -I/usr/local/include -L/usr/local/lib -lPocoFoundation sample.cpp

実行例

$ env LD_LIBRARY_PATH=/usr/local/lib ./a.out
ABC

Base64 エンコーディング/デコーディング

Poco/Base64Encoder および Poco/Base64Decoder の使用例です。stringstream は istream と ostream を多重継承しているため Encoder/Decoder 両方で使用可能です。stringstream の使用方法もご参照ください。

#include <iostream>
#include <string>
#include <sstream>
#include <Poco/Base64Encoder.h>
#include <Poco/Base64Decoder.h>
using namespace std;

int main() {
    stringstream ss;
    ss.str(""); // 初期化

    Poco::Base64Encoder enc(ss); // cout のように使用
    enc << "ABCDEFG";
    enc.close();
    cout << ss.str() << endl; //=> QUJDREVGRw==

    Poco::Base64Decoder dec(ss); // cin のように使用
    string str;
    dec >> str;
    cout << str << endl; //=> ABCDEFG

    return 0;
}

日付関連

Poco/DateTime の使用例です。

#include <iostream>
#include <cstdio>
#include <Poco/DateTime.h>
using namespace std;

int main() {
    Poco::DateTime now;
    printf("%d/%02d/%02d\n", now.year(), now.month(), now.day()); //=> 2015/05/16
    return 0;
}

その他

ドキュメントについて

C/C++ ライブラリにはよくあることですが、オンラインの公式ドキュメントは充実しておらず、ビルド時にダウンロードしたパッケージにサンプルコードやドキュメントが含まれています。

$ find . -name 'doc'
./CppUnit/doc
./Data/doc
./doc
./NetSSL_OpenSSL/doc
./PageCompiler/doc
./Zip/doc