1

ビルドに autotools を使用し、単体テストにCatch2を使用する C++ プロジェクトがあります。Catch2 の詳細はおそらく関係ありません。これは、ビルドして実行する必要がある別のプログラムにすぎません。

私はMakefile.amこのように設定しました(簡略化):

AUTOMAKE_OPTIONS = subdir-objects
check_PROGRAMS = catch2
bin_PROGRAMS = lpsdr

common_sources = applicationcontroller.cc flowgraph.cc [...]
lpsdr_SOURCES = $(common_sources) main.cc
catch2_SOURCES = $(common_sources) test.cc

これは、すべてを 2 回コンパイルし、 とlpsdr-applicationcontroller.oを作成することを除いて、ほとんどの場合機能します。catch2-applicationcontroller.ocommon_sources

もちろん、これによりビルド時間は 2 倍になります。catch2と の両方を同じオブジェクト ファイルにリンクすることをお勧めしlpsdrます。その方がビルドが高速であり、実行中のコンパイル済みコードとまったく同じコードをテストしていることを確認できます。

この動作を回避する方法はありますか?

4

1 に答える 1

3

プログラムごとに個別のオブジェクト ファイルを作成することを回避する方法があるかどうかはわかりませんが、中間の静的ライブラリを作成し、リンクlpsdrしてそれcatch2に対して行うことで、同じ効果が得られます。

このようなもの:

AUTOMAKE_OPTIONS = subdir-objects

noinst_LIBRARIES = liblpsdr.a
check_PROGRAMS = catch2
bin_PROGRAMS = lpsdr

liblpsdr_a_SOURCES = applicationcontroller.cc dispatcher_sink.cc [...]

lpsdr_SOURCES = main.cc
lpsdr_LDADD = liblpsdr.a
catch2_SOURCES = test.cc
catch2_LDADD = liblpsdr.a
于 2020-04-12T21:20:03.630 に答える