62

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
4

8 に答える 8

80

非常によく似たエラーのデバッグに信じられないほどの時間を費やしました。これが私が学んだことです:

  • -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 つに問題があることを意味します。エラー メッセージに記載されている関数を確認し、それがコピー構築するオブジェクトの種類を確認し、それらのクラスのいずれかにコピー コンストラクターがないかどうかを確認します。1 つ追加すると、エラーはなくなります。

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

于 2009-05-18T19:33:42.747 に答える
15

リンクするときのフラグは-lgcovです。つまり、変更します。

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

gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
于 2009-02-19T21:38:37.960 に答える
14

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

によるとman gcc

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

于 2011-03-18T13:34:35.713 に答える
13

ここで提案されているように、-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は最後にリンクされたライブラリでなければならないことに注意してください。

于 2010-11-03T13:36:17.410 に答える
6

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

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

于 2009-02-19T19:57:11.203 に答える
3

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

于 2012-08-08T21:29:56.607 に答える
2

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

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

于 2011-02-21T07:49:49.910 に答える
-1

そこで、CFLAGS に -shared を追加したところ、複数のファイルで動作するようになりました。もちろん、変なところにコアリングしているので、まだ何のことかわかりません。

于 2009-02-19T21:18:37.877 に答える