2008-12-22
MacでBoost
今までWindows+CygwinでBoostを使っていたのだけど、帰省するのでMac+terminalの環境でもBoostが使える様になりたいと思ったので設定。この手の設定は非常にめんどくさい。
ちなみにBoostとはC++の拡張ライブラリでC++が苦手とする正規表現の文字列操作やコンテナをスマートにしてくれる補助ライブラリ。補助といってもどっかの誰かが適当に作ったライブラリでなくC++標準委員会という機関に対してそれなりの影響力をもってるというの。というのも委員の人の多くがBoostに携わってる人だかららしい。個人的には次のC++に付きそうな機能のテスト場所だと思ってる。
Macportのインストール
でBoostをMacで使いたいので早速インストール。まずはお手軽にBoostをインストールするためにMacPortをインストール。Macportを使うと前回私がUbuntuでやったような感覚で必要なパッケージを簡単にインストールできる。
まず最初にファイルをhttp://www.macports.org/からダウンロードする。必要なファイルはhttp://www.macports.org/install.phpのページの上の方にリンクがあるので、OSのバージョンにあわせてインストール。ちなみにXcodeも必要になる。無い人はまずそれから入れて
でMacportのインストールが終わったらパスを張って行く、一々ターミナルにexport~と打ち込むのもめんどくさいので.bashrcに一気に全部書き込む。ちなみにMacportはインストールが終わったらターミナル(terminal.app)から使用できる。
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH export MANPATH=/opt/local/man:$MANPATH export LIBRARY_PATH=/opt/local/lib:$LIBRARY_PATH export LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib export BOOST_ROOT=/opt/local/include/boost:$BOOST_ROOT
書き込みが終わったらsource .bashrcで反映させる。あとはMacport自体を更新したいので
$ sudo port -d selfupdate $ sudo port -d sync
以上。
Boostのインストール
$ sudo port install jam $ sudo port install boost
でインストール。途中で作業が固まったりこけた場合は
$ sudo port clean --work boost
見たいな感じで一度cleanする。それでも復旧できない場合は/opt/local/var/_opt_~~みたいな感じの一時的な作業ディレクトリーを削除。以上。
適当にテストファイル
パスが通っていてかつちゃんと使える事を使える事を確認したいので適当にテストファイルを作成
#include <iostream> #include <boost/cast.hpp> int main(){ return 0; }
あとはg++通常通りコンパイル。パスが通ってない場合boost/cast.hppが見つからないとか出るのでパスを確認して行く。
で実際に使ってみるとこうなる。今回使うのはboost::regex。正規表現を扱ってくれるもの。サンプル、内容、正規表現についてはこちらから拝借
#include <iostream> #include <boost/regex.hpp> #include <string> using namespace std; int main(int argc, int *argv[]){ boost::regex reg_exp; string str_reg; string str; string replace; string result; cout << "input Regular Expression ->"; getline(cin, str_reg); reg_exp = str_reg; cout << "input Replace word ->"; getline(cin, replace); while(true){ cout << "input Result word ->"; getline(cin, str); result = boost::regex_replace(str, reg_exp, replace, boost::format_no_copy); cout << result << endl; } return 0; }
ファイルを作成したらコンパイル。コンパイルする際はライブラリ等をリンクしないと行けないので少し面倒だが-Iオプションでリンクする。今回はフルパスで指定
$g++ ファイル -I/opt/local/include/boost /opt/local/lib/libboost_regex-mt.a
で完成。当たり前だけどリンクしないとsymbolエラーになるので面倒だけど使うライブラリはリンクする。けど正直この程度ならRubyで書いた方が速いし楽しい。
参考にさせていただいたサイト
- 4 http://d.hatena.ne.jp/keyword/C++
- 4 http://d.hatena.ne.jp/mkusunok/
- 4 http://twitter.com/aduka
- 3 http://beta.bloglines.com/b/view
- 2 http://ezsch.ezweb.ne.jp/search/ezGoogleMain.php?query=アニメGL画像&start-index=24&adpage=5&mode=02
- 2 http://ezsch.ezweb.ne.jp/search/ezGoogleMain.php?query=今年+就職率&start-index=4&adpage=3&mode=03
- 2 http://reader.livedoor.com/reader/
- 2 http://www.google.co.jp/reader/view/?hl=ja&tab=wy
- 1 http://blog-search.yahoo.co.jp/search?ei=UTF-8&p=SKAGEN&n=10&so=dd&merge=on&tflg=none&Keywords=SKAGEN&xargs=12KPjg1klStoe9mvinN-mZDrDaoAtP0cHwsd5sCpN8HKQco2dvVOMLb6CNqvd-D705taPhz1ql_lYmfWHNmuaIUj5ofFGMsdTo2b3AZbo_xp9FYOJDkfV1k632LrTmH0wFFm25bNAmv
- 1 http://blog-search.yahoo.co.jp/search?fr=top_ga1&ei=UTF-8&p=留年