EclipseのCDTで、boost!
Windowsの Eclipseで C++開発をする際に boostを使う方法ではまった所をメモ。
・http://www.boost-consulting.com/products/free より、最新版をDownloadしてきます。VC++7.1 もしくは VC++8.0 で開発する分にはこちらをインストールすれば全て完了です。デフォルトでは、「C:\boost\boost_1_34_1」にインストールされます(以下では、これを基準に記述しています)。
・MinGW 上の gccで boostを使うには自前でライブラリをbuildする必要があります*1。boost::unit_test を使おうとしたところ、buildの必要があったのでMinGW用の build手順を書いておきます。buildの方法は、Let's Boost - インストール方法 を参考にしました。
・まずは、C:\boost\boost_1_34_1\bin\bjam.exeを、C:\boost\boost_1_34_1\ へコピーしておきます。
・boostの buildは、MSYS上で行います。前Entryで作った、sh.batを実行し以下のコマンドを実行します。
$ cd /c/boost/boost_1_34_1/ $ ./bjam --toolset=gcc link=static,shared release debug stage
以上で、buildが始まります。しばらく時間がかかる*2ので待ちましょう。
・buildが完了すると「C:\boost\boost_1_34_1\stage\lib」に *.aと *.dllとファイルが大量にできます。最後に、Eclipseから -lでリンクする際に *.aではリンクができなかったので、ファイル名を *.libに変更しておけば完了です。
例えば、libboost_unit_test_framework が必要な場合は、libboost_unit_test_framework-mgw34-d-1_34_1.a を libboost_unit_test_framework.lib とコピーしておきます。
・最後に、Eclipse CDTで boost::unit_testをする場合の設定
- プロジェクトのプロパティ:C/C++ ビルド>設定>ツール設定>GCC C++ コンパイラー>ディレクトリー>インクルード・パス(-I)
- に、「C:\boost\boost_1_34_1」を追加:
- プロジェクトのプロパティ:C/C++ ビルド>設定>ツール設定>MinGW C++ リンカー>ライブラリー>ライブラリー(-l)
- に、「libboost_unit_test_framework」を追加:
- プロジェクトのプロパティ:C/C++ ビルド>設定>ツール設定>MinGW C++ リンカー>ライブラリー>ライブラリー検索パス(-L)
- に、「"C:\boost\boost_1_34_1\stage\lib"」を追加:
以上で、以下のようなテストが書けるようになります*3。
#include <vector> #include <boost/test/unit_test.hpp> using namespace std; using namespace boost::unit_test_framework; // // STLのvectorクラステンプレートのテストコードを書いてみました。 // void push_back_test() { vector<int> v; BOOST_CHECK( v.empty() ); BOOST_CHECK_EQUAL( v.size(), 0 ); v.push_back( 1 ); v.push_back( 2 ); BOOST_CHECK( !v.empty() ); BOOST_CHECK_EQUAL( v.size(), 2 ); BOOST_CHECK_EQUAL( v.front(), 1 ); BOOST_CHECK_EQUAL( v.back(), 2 ); } void at_test() { vector<char> vi( 100, 'a' ); BOOST_CHECK_THROW( vi.at(100), std::exception ); } void construct_test() { vector<int> vi( 100, 3 ); BOOST_CHECK_EQUAL( vi.size(), 100 ); BOOST_CHECK_EQUAL( vi[10], 3 ); vector<double> vd( vi.begin(), vi.end() ); BOOST_CHECK_EQUAL( vd.size(), 100 ); BOOST_CHECK_EQUAL( vd[99], 3.0 ); } // // テストケースをここでtest_suiteに追加して返すと、 // あとはライブラリ側でテストを走らせてくれます。 // test_suite* init_unit_test_suite( int argc, char* argv[] ) { test_suite* test = BOOST_TEST_SUITE( "std::vector test" ); test->add( BOOST_TEST_CASE( &construct_test ) ); test->add( BOOST_TEST_CASE( &at_test ) ); test->add( BOOST_TEST_CASE( &push_back_test ) ); return test; }
*1:いくつかのライブラリは、特にbuildが必要ないため ヘッダファイルを includeするだけで使えます
*2:自分の環境では 1時間程度かかりました
*3:ソースは、http://www.kmonos.net/alang/boost/classes/test.html のsampleままです