gcov シンボルはどこにありますか? 質問する

gcov シンボルはどこにありますか? 質問する

GCOVで簡単なアプリをコンパイルし、次のリンクエラーを取得しようとしています。

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
AllTests.o: In function `global constructors keyed to 0_RunAllTests':
/home/p7539c/cutest/AllTests.c:26: undefined reference to `__gcov_init'
AllTests.o:(.data+0x44): undefined reference to `__gcov_merge_add'
CuTestTest.o: In function `global constructors keyed to 0_TestCuStringNew':
/home/p7539c/cutest/CuTestTest.c:30: undefined reference to `__gcov_init'
CuTestTest.o:(.data+0x64): undefined reference to `__gcov_merge_add'
CuTest.o: In function `global constructors keyed to 0_CuStrAlloc':
/home/p7539c/cutest/CuTest.c:379: undefined reference to `__gcov_init'
CuTest.o:(.data+0x184): undefined reference to `__gcov_merge_add'
collect2: ld returned 1 exit status
make: *** [TestTest] Error 1

不足しているシンボルの場所が見つからないようです。gcov は gcc バージョン 4.1.2 を実行しているマシンに存在します。

何かアイデアはありますか? ありがとうございます。

編集時:

1 つの .c ファイルで構成されるアプリケーションで gcov を使用すると、すべて正常に動作するように見えます。複数の .c ファイル (つまり複数の .o ファイル) がある場合は、上記の問題が発生します。

コンパイルステップは次のようになります。

cc -fprofile-arcs -ftest-coverage -g   -c -o AllTests.o AllTests.c
cc -fprofile-arcs -ftest-coverage -g   -c -o CuTestTest.o CuTestTest.c
cc -fprofile-arcs -ftest-coverage -g   -c -o CuTest.o CuTest.c

ベストアンサー1

私は非常によく似たエラーをデバッグするのに信じられないほどの時間を費やしました。

  • -fprofile-arcs -ftest-coverageコンパイル時に渡す必要があります。
  • リンクするときに渡す必要があります-fprofile-arcs
  • リンクするときは、奇妙なリンカーエラーを取得できます。

    libname.a(objfile.o):(.ctors+0x0): undefined reference to 'global constructors keyed to long_name_of_file_and_function'

これは、gconv がコンパイラー生成のコンストラクター (私の場合はコピー コンストラクター) の 1 つに問題があることを意味します。エラー メッセージに記載されている関数を確認し、どのような種類のオブジェクトをコピー コンストラクターするかを確認し、それらのクラスのいずれかにコピー コンストラクターがないかどうかを確認します。コピー コンストラクターを追加すると、エラーは解消されます。

編集: 最適化するかどうかもこれに影響します。問題がある場合は、最適化をオン/オフにしてみてください。

おすすめ記事