0

最近、C++ プロジェクトの単体テスト ( GoogleTestを使用) の作成を開始しました。メイン プロジェクトのビルドは非常に簡単です。GCC-MM-MDフラグを使用してオブジェクト ファイルの依存関係を自動的に生成し、すべてのオブジェクト ファイルをリンクして出力実行可能ファイルを作成します。驚きはありません。

しかし、単体テストを書いているときに、各テストをコンパイルするために必要なオブジェクト ファイルを make または GCC に判断させる方法はありますか? 現在、私はかなり素朴な解決策 (それと呼べるなら) を持っています。これは、すべての単体テストのために利用可能なすべてのオブジェクト ファイルをまとめてコンパイルするもので、明らかに (時間とスペースの両方の点で) 無駄です。元のソース ファイルの依存関係を生成する方法と同様の方法で、特定の単体テストに必要なオブジェクト ファイルを特定する方法 (make、gcc、sed、またはその他のものを使用) はありますか?

4

4 に答える 4

1

CmakeGNU Automakeなど、プロジェクト管理のより高度な抽象化に目を向ける必要があります。

于 2010-07-27T13:44:29.287 に答える
1

ソース ファイルには 2 つのグループがあるようです。1 つは実際にプログラムを実装し、もう 1 つはすべての単体テストです。各単体テストには独自のmain機能があり、単体テストが互いに呼び出す必要はないと思います。

すべてが正しい場合、最初のグループのすべてのファイルを静的ライブラリに配置し、各単体テストをそのライブラリに対してリンクできます。リンカーは、ライブラリから必要なオブジェクト ファイルのみを自動的にプルします。

具体的な Makefile 用語では:

LIBRARY_OBJECTS = a.o b.o c.o d.o # etc
UNIT_TESTS = u1 u2 u3 u4 # etc
UNIT_TEST_OBJECTS = $(UNIT_TESTS:=.o)

libprogram.a: $(LIBRARY_OBJECTS)
        ar cr $@ $?

$(UNIT_TESTS): %: %.o libprogram.a
        $(CC) $(CFLAGS) -o $@ $< -lprogram
于 2010-07-27T18:51:53.227 に答える
0

Makefile で

     SOURCES.cpp = a.cpp b.cpp ...
     OBJECTS = $(SOURCES.cpp:%.cpp=%.o)

     all: program

     program: $(OBJECTS)
          $(LINK) -o $@ $(OBJECTS)
于 2010-07-27T15:21:28.300 に答える
0

おそらく、テストシステムがどれほど整然としているかによって異なります。

ヘッダー ファイルとソース ファイルの間に適切な 1 対 1 の関係がある場合は、いくつかのテキスト変換関数 (または sed の呼び出し) を使用して、既にある機械生成ルールを変換できます。

foo.o: foo.cc foo.h bar.h gaz.h

対応するテストのルールに:

unit_test_foo: unit_test_foo.o foo.o stub_bar.o stub_gaz.o

または、対応するヘッダーなしで多くのスタブを使用する場合 (これは警告サインです)、stub_foo.oを除くすべてのスタブにリンクできます。これらのオブジェクト ファイルは小さく、頻繁に変更されることはないため、安価です。

于 2010-07-27T18:32:50.377 に答える