BOOST TEST - 複数ファイルで静的ライブラリを利用2020年05月12日 11時54分44秒

BOOST TEST - minimal ヘッダファイルを使わない新しい単体ファイル形式で利用では新しい形式の単一ファイルでの BOOST TEST の使い方を紹介した。BOOST TEST 自体を実験する場合には便利なのだが、沢山のテストがある実用にはあまり向かない。

The static library variant にはライブラリの説明が書いてある。boost_unit_test_framework ライブラリをリンクする場合には少し特別な形式でファイルを準備する必要がある。一つのファイルのみ BOOST_TEST_MODULE を定義する。これは静的ライブラリを利用するにも、動的ライブラリを利用する場合にも当てはまる。

静的ライブラリの方が準備されている main 関数を使えるので下準備は少なく、簡単ではある。しかし、動的 boost_unit_test_framework がリンクされてしまうのを防ぐために、-static リンクオプションが必要になる。そのため、他のライブラリをリンクしようとすると面倒な事に陥る事もあるようだ。そのため、下準備にちょっと追加で出来る動的ライブラリの方が総合的には使いやすい様だ。

まず、一つ目の特別なファイル。

// c++ -c -o 1.o -I /usr/local/include/ boost_static_unit_test1.cpp

#define BOOST_TEST_MODULE Verify Std C++
#include <boost/test/unit_test.hpp>
まずは、少し気を付ける事項から。
  1. BOOST_TEST_MODULE を定義する。
  2. boost/test/included.unit_test.hpp ではなく boost/test/unit_test.hpp を使う。
  3. それ以外は書かない。
このファイルにテストケースを書くことも可能だが、BOOST_TEST_MODULE の為だけにファイルを準備した方が、特別性を際立たせるのに都合が良い。このファイルはこれ専用にするのを勧める。

これをコンパイルする。今回は、-c オプションを使ってコンパイルのみにする。

% c++ -c -o 1.o -I /usr/local/include/ boost_static_unit_test1.c
-I はどこに boost ライブラリがインストールされているかに依存する。Linux 系だったら /usr/include 以下で特に必要無いだろう。BSD 系だと /usr/local/include が必要になる。

次に実際にテストケースを書くファイルの説明に移る。まず、一番大切な事。BOOST_TEST_MODULE は絶対に定義しない。それ以外は、単体の時と同じように BOOST TEST CASE を書く。

// c++ -c -o 1.o -I /usr/local/include/ boost_static_unit_test.cpp
// c++ -c -o 2.o -I /usr/local/include/ boost_static_unit_test.cpp
// c++ 1.o 2.o -static -L /usr/local/lib -l boost_unit_test_framework

#include <memory>
#include <boost/test/unit_test.hpp>
// #include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE( test_shard_ptr )
{
    int one = 1;
    int two = 3;

    BOOST_CHECK( one == 1 );
    BOOST_CHECK( two == 2 );

    BOOST_CHECK_EQUAL( one, 1 );
    BOOST_CHECK_EQUAL( two, 2 );

    BOOST_REQUIRE( one == 1 );
    BOOST_REQUIRE( two == 2 );

    // return 0;
}

そして、二つ目のファイルをコンパイルし、リンクする。-I オプションと同様に、-L オプションも環境依存。大概の場合は動的ライブラリと静的ライブラリがインストールされているので -static を指定して、明示的に静的ライブラリを使う。また、静的ライブラリから main 関数を引っ張って来てくれる。

% c++ -c -o 2.o -I /usr/local/include/ boost_static_unit_test2.cpp
% c++ 1.o 2.o -static -L /usr/local/lib -l boost_unit_test_framework
% ./a.out 
Running 1 test case...
boost_static_unit_test2.cpp(15): error: in "test_shard_ptr": check two == 2 has failed
boost_static_unit_test2.cpp(18): error: in "test_shard_ptr": check two == 2 has failed [3 != 2]
boost_static_unit_test2.cpp(21): fatal error: in "test_shard_ptr": critical check two == 2 has failed

*** 3 failures are detected in the test module "Verify Std C++"
リンク後の実行結果は前回と同じになる。

前回次回