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 両方で使用可能です。
#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
関連記事
- ダウンキャスト (C++をもう一度)実行時型情報 RTTI #include <iostream> #include <typeinfo> using namespace std; class MyClass { public: virtual ~MyClass() {} // typeid で正しい RTTI // (RunTime Type Information; 実行時型情報) ...
- 競技プログラミングの基本処理チートシート (C++)限られた時間の中で問題を解くために必要となる、競技プログラミングにおける基本的な処理のチートシートです。競プロにおけるメジャー言語 C++ を利用します。その際 C++11 の機能は利用せず C++03 の機能の範囲内で記述します。 頻度高く定期的に開催されるコンテスト AtCoder Codeforces main.cpp #include <iostream>
- 構造体と列挙体 (C++をもう一度)構造体 #include <iostream> using namespace std; struct MyStruct { char charval; int intval; }; void Show(MyStruct* obj) { cout << obj->intval << endl; } int main() { ...
- Valgrind による C/C++ メモリリーク検出JVM メモリリークでは JDK の jstat や jmap で原因を調査できます。C/C++ では valgrind の Memcheck ツールが利用できます。valgrind には複数のツールが含まれており既定のツールが Memcheck です。他のツールを利用する場合は --tool オプションで指定します。 [簡単な利用例](h
- クラスの基本/初期化 (C++をもう一度)構造体のように初期化する (非推奨) #include <iostream> using namespace std; const int MAX_STR = 16; class MyClass { public: int m_integer; char m_str[MAX_STR + 1]; void Show(); }; void MyClass::Show...