GOL @Wiki
C++でWebアプリを作る
最終更新:
divadiva
-
view

WtというC++用のWebツールキットで遊んでみます。詳しくはWtのページを参照して頂きたいのですが、WtというのはGPLで配布されているC++でWebアプリを作るためのライブラリとアプリケーションサーバで構成されています。Webアプリのための・・・というと、JSFやSpring、Strutsなどを思い浮かべますが、これらPage-basedなFrameworkとは異なり、WtはWidget-centricなライブラリであるとWtのページでは説明されています。
これからいじりますので、まだ理解が間違っているかも知れませんが、様々な技術や手法が入りまじって複雑化してきつつあるWebアプリ開発に対して、既存のアプリケーションを開発してきた開発者が従来の手法を駆使して取り組むことを可能とするツールキット、といった感じではないでしょうか。
(ちょっと説明がヘタですが、徐々にわかりやすく説明していきたいと思います)
(ちょっと説明がヘタですが、徐々にわかりやすく説明していきたいと思います)
Wtで遊ぶ環境をつくる
まずはCMakeというオープンソースのビルドツールキットを導入します。
imageプラグインエラー : 画像を取得できませんでした。しばらく時間を置いてから再度お試しください。
CMakeは数多くのOS環境に対応したバイナリがダウンロード可能ですが、残念ながらSolarisはSparcのみですので(私の環境はSolaris x86なので・・・)、ソースをダウンロードしてコンパイルします。コンパイルはとても簡単で、ダウンロードアーカイブを展開して、展開したディレクトリ内にCDし、
cd cmake-2.4.8 ./bootstrap make make install
すればOKです。ちなみに私のコンパイル環境は、Cコンパイラがgcc、C++コンパイラがg++で、バージョンは3.4.3です。makeはgmake(GNU Make)3.80を使用しており、特に問題なくCMakeのビルド&インストールは完了しています。特にオプションをしなかったため、/usr/local以下にインストールされました。
次にBoostを導入します。
今回のバージョンは1.35でした。BoostのHPからダウンロードしてきたアーカイブを解凍して、「Boost Getting Started」などのドキュメントを参考に、インストールをしましょう。
※Boostのライブラリのリンク時、リンカオプションがSolaris標準のldに適合しなかったため、一時的にリンカをGNU ldに入れ替えました。また、ICUライブラリについてはソースからGCCで再コンパイルしました。
su - cd /usr/ccs/bin mv ld ld.org # Solaris標準ldをバックアップ ln -s /usr/sfw/i386-sun-solaris2.11/bin/ld ld # GNU ldのリンクを作成 〜 Boostをビルド&インストール 〜 rm ld mv ld.org ld # Solaris標準ldを復活
上記の準備が済めば、あとはどのようにサーバ側を構成するかを決定します。ApacheなどのWebサーバにFastCGIを組み込んで、FastCGI経由でWtアプリケーションを呼ぶ方式か、専用のhttpdを構築するか、選択できます。今回は前者、Apache2.2+FastCGIでいきます。
具体的にはFastCGIのThe Development Kitと、Apache用のモジュールであるmod_fastcgiをダウンロードしてインストールします。Solarisの場合、パッケージインストール済みのApacheモジュールを利用したいところですが、その場合はFastCGIのコンパイルなどがうまくいきません。私も最初はチャレンジしてみましたが、なかなか大変なので、結局Apacheをソースからコンパイルして入れ直しました。そうすればFastCGIは素直にインストール可能となります。
具体的にはFastCGIのThe Development Kitと、Apache用のモジュールであるmod_fastcgiをダウンロードしてインストールします。Solarisの場合、パッケージインストール済みのApacheモジュールを利用したいところですが、その場合はFastCGIのコンパイルなどがうまくいきません。私も最初はチャレンジしてみましたが、なかなか大変なので、結局Apacheをソースからコンパイルして入れ直しました。そうすればFastCGIは素直にインストール可能となります。
事前準備が済んだら、ようやくwtのビルドに取りかかることが出来ます。まずはコンフィグ。cmakeコマンドには、環境ごとに適切なオプション値を与える必要があります。
cmake -DBOOST_INCLUDE_DIRS=/usr/local/include/boost-1_35 -DBOOST_DIR=/usr/local -DBOOST_COMPILER=gcc34 -DCONNECTOR_FCGI=YES -DEXAMPLES_CONNECTOR=wtfcgi ../ ** Using supplied mxml library. ** Enabling multi threading. ** Enabling FastCGI. ** Enabling built-in httpd. -- ** Mandelbrot example needs gd library... Skipping. -- ** Style example needs gd library... Skipping. -- ** hangman example needs mysql++-2.x library... Skipping. -- Configuring done -- Generating done -- Build files have been written to: /export/home/tomo/work/wt-2.1.2/build
このあとmakeを走らせてコンパイルすればいいのですが、Solarisの場合、random_device.cppのコンパイルでエラーが発生するかもしれません。私の場合は、wt-2.1.2/src/web/random_device.cpp 内で、struct boost::random_device::impl が定義されていないというエラーが発生しました。random_device.cppではLinux、Windowsそれぞれの場合のimplクラスが定義されており、それぞれのクラス定義が、
#ifdef __linux__ 〜 Linuxの場合のimplクラス定義 〜 #endif
あるいは、
#ifdef WIN32 〜 Windowsの場合のimplクラス定義 〜 #endif
となっているため、Solarisの場合はどちらの定義も有効にならず、未定義となってしまいます。そこで、Linuxの#ifdefと#endifをコメントアウトして、強制的にLinuxの場合の定義を有効とします。
そのほかは問題なくコンパイルに成功すると思います。
〜工事中〜