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
私は、非常に似たエラーをデバッグするために信じられないほどの時間を費やしました。私が学んだことは次のとおりです。
-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つ追加すると、エラーはなくなります。
編集:最適化するかどうかもこれに影響します。問題がある場合は、最適化のオン/オフを切り替えてみてください。
探しているフラグは -lgcovリンク時 です。つまり、変更:
gcc AllTests.o CuTestTest.o CuTest.o -o TestTest
に
gcc -lgcov AllTests.o CuTestTest.o CuTest.o -o TestTest
ここで提案されているように が見つかりました。-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は最後にリンクされたライブラリでなければならないことに注意してください。
コンパイルおよびリンクするときは、コマンドラインで--coverage
のみを指定できる必要があります。
man gcc
によると:
このオプションは、
-fprofile-arcs
-ftest-coverage
(コンパイル時)および-lgcov
(リンク時)の同義語です。
gcc -ftest-coverage -fprofile-arcs test.c
を使用して簡単なテストファイルを試しましたが、説明したような問題はありませんでした。
リンク時に-ftest-coverage
フラグが存在する場合、gccはgcovライブラリを取り込むと思われます。 gccコマンドラインでそのフラグを渡してみてください。
おそらく明らかに、この正確なエラーメッセージは、非gccリンカーとリンクするときに生成されます。 ifortとリンクするときにこのエラーが表示されます(コードにFortranモジュールとCモジュールの両方が含まれているため)。 gccとのリンクに切り替えるとうまくいきました。
Great Max Lybbert、基本的にautoconfを使用する場合は_LDADD = -lgcovを追加します...
これで問題が解決します。