EclipseのCDTで、boost!

WindowsEclipseC++開発をする際に 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ままです