web-dev-qa-db-ja.com

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
58
john146

私は、非常に似たエラーをデバッグするために信じられないほどの時間を費やしました。私が学んだことは次のとおりです。

  • コンパイル時に_-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'

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

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

74
slicedlime

探しているフラグは -lgcovリンク時 です。つまり、変更:

gcc AllTests.o CuTestTest.o CuTest.o -o TestTest

gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
14
Max Lybbert

ここで提案されているように が見つかりました。-fprofile-arcs-ftest-coverageでビルドされた.oを含む共有ライブラリをビルドするときにビルドラインに-lgcovを追加すると、これが解決しました。そしてもちろん、実行可能ファイルを-lgcovにリンクします。次のように共有ライブラリを構築します。

g++    -shared -o libMyLib.so src_a.o src_b.o src_c.o -lgcov

そして、そのような実行可能ファイル:

g++ -o myExec myMain.o -lMyLib -lgcov

共有ライブラリ(exeだけでなく)のビルドに-lgovを追加すると、この追加エラーが解決されました。

hidden symbol `__gcov_merge_add' in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcov.a(_gcov_merge_add.o) is referenced by DSO
/usr/bin/ld: final link failed: Nonrepresentable section on output

-lgcovは最後にリンクされたライブラリでなければならないことに注意してください。

11
Ogre Psalm33

コンパイルおよびリンクするときは、コマンドラインで--coverageのみを指定できる必要があります。

man gcc によると:

このオプションは、-fprofile-arcs-ftest-coverage(コンパイル時)および-lgcov(リンク時)の同義語です。

11
Oskari Timperi

gcc -ftest-coverage -fprofile-arcs test.cを使用して簡単なテストファイルを試しましたが、説明したような問題はありませんでした。

リンク時に-ftest-coverageフラグが存在する場合、gccはgcovライブラリを取り込むと思われます。 gccコマンドラインでそのフラグを渡してみてください。

5
flodin

おそらく明らかに、この正確なエラーメッセージは、非gccリンカーとリンクするときに生成されます。 ifortとリンクするときにこのエラーが表示されます(コードにFortranモジュールとCモジュールの両方が含まれているため)。 gccとのリンクに切り替えるとうまくいきました。

2
dbn

Great Max Lybbert、基本的にautoconfを使用する場合は_LDADD = -lgcovを追加します...

これで問題が解決します。

1
siddhusingh