8

次のディレクトリ レイアウトを持つより大きなプロジェクトに取り組んでいます。

Source
 MyA
  aa.cpp
  ab.cpp
  ac.cpp
 MyB
  ba.cpp
  bb.cpp
  bc.cpp
 MyTest
  testaa.cpp
  testab.cpp
  testac.cpp
  testba.cpp
  testbb.cpp
  testbc.cpp
  main.cpp
Build
 MyA
  aa.o
  ab.o
  ac.o
  libMyA.a (static library)
 MyB
  ba.o
  bb.o
  bc.o
  libMyB.a (static library)
 MyTest
  testaa.o
  testab.o
  testac.o
  testba.o
  testbb.o
  testbc.o
  MyTest (executable)

でコンパイルした後-fprofile-arcs -ftest-coverage、Build/MyTest ディレクトリ内で MyTest アプリケーションを実行します。予想どおり、Build ディレクトリ内に *.gcno および *.gcda ファイルがあります。MyTest ディレクトリ内で gcov を実行すると、さまざまな *.gcov ファイルが生成されますが、残念ながら MyA と MyB 内のすべてのものではありませんが、すべての関数はこの 2 つのライブラリ内で呼び出されます。さまざまなオプションを試しましたが、どういうわけか、このレイアウトで有用な (つまり正しい) *.gcov ファイルを作成できません。

すべての cpp を 1 つのディレクトリ内にコピーして手順を繰り返すと、すべてが期待どおりに機能し、カバレッジ分析は完璧です。

4

3 に答える 3

10
  1. ソース ファイルを g++/gcc への絶対パスとして指定する必要があります。".." や "foo/bar.cpp" のような相対パスを使用しないでください。そうしないと、"geninfo: WARNING: no data found for XXXX" のようなエラーが発生します。

  2. コマンド ラインでヘッダー ファイルを g++/gcc にインクルードしないでください。そうしないと、「スタンプがグラフ ファイルと一致しません」というエラーが発生します。

したがって、複数のディレクトリがある場合、次のように動作するはずです。

g++ --coverage -DDEBUG -g3 heyo.cpp /app/helper/blah.cpp /app/libfoo/foo.cpp -o program

./program

lcov --directory . --capture --output-file app.info

genhtml --output-directory cov_htmp app.info

または、既に相対パスを使用している Makefile を使用している場合は、次を使用すると便利です。

g++ --coverage -DDEBUG -g3 $(abspath heyo.cpp helper/blah.cpp ../foo/bar/baz.cpp) -o program
于 2011-11-20T13:16:52.470 に答える
5

ディレクトリ構造を保持できるようにするには、各ソース ファイル フォルダー内で gcov を 1 回実行する必要がありますが、-oオプションを使用して gcov にデータ ファイルの場所を伝えます。

私はそれが次のようであるべきだと思います:

gcov -o ../../Build/MyA *.cpp

同様のソース ファイル構造のプロジェクトがありますが、コンパイラにオブジェクト ファイルなどをソース フォルダーにダンプさせます。次に、ソース ファイルごとに 1 回、ルート フォルダーから gcov を複数回実行しますが、ソース ファイルの相対パスを指定し、-o次のようにオプションを使用して相対フォルダーを指定します。

gcov -o Source/MyA Source/MyA/aa.cpp
于 2011-04-09T21:51:41.330 に答える