12

ビルド スクリプトに GNU Autotools を使用し、リンクに libtool を使用する C++ プロジェクトがあります。最近、gcov を使用してコード カバレッジ インストルメンテーションを追加しました。

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"

.. myCFLAGSとeach に含まれLDFLAGSます。g++-4.2 (自作でインストール) を使用する OS X 10.7.4 では、すべて正常に動作します。

g++ 4.6.3 を使用する Ubuntu 12.04 では、libtool がテストの 1 つをリンクできません。

/bin/bash ./libtool --tag=CXX   --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib   -o myproj/inttests/locale_test myproj/inttests/locale_test.o myproj/app/libapp.la -lboost_thread-mt -lboost_system-mt -pthread -llog4cplus  
libtool: link: g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -Wl,-rpath -Wl,/usr/local/lib -o myproj/inttests/.libs/locale_test myproj/inttests/locale_test.o -pthread  -L/usr/local/lib myproj/app/.libs/libapp.so -lboost_thread-mt -lboost_system-mt /usr/lib/liblog4cplus.so -pthread
/usr/bin/ld: myproj/inttests/.libs/locale_test: hidden symbol `atexit' in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(atexit.oS) is referenced by DSO
/usr/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
make[2]: *** [myproj/inttests/locale_test] Error 1

ubuntu/g++ 4.6 でビルドを修正するにはどうすればよいですか?

4

2 に答える 2

6

グーグルで調べた後、実行時に追加することを提案するこのスレッドが表示されます。確かに、そのポスターではうまくいきませんでしたが、私にとってはうまくいきます:--coverageCXXFLAGS./configure

./configure CXXFLAGS="--coverage"

ただし、この変数はパッケージ インストーラー用に予約されており、メンテナー (私) 用ではありません。問題は、「これをビルドに適切に組み込むにはどうすればよいですか?」ということになります。

不十分なものは次のとおりです。

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"

GCOV_CFLAGSが有効に含まれていると仮定するとCXXFLAGS(表示されていませんが、含まれています)、この修正は機能するはずです。そうではありません。

CXXFLAGS="--coverage"さらに掘り下げてみると、コマンドラインからドロップして代わりにconfigure.acどこかに配置する場合、少なくともある程度の牽引力を得る必要があるようです. これも実際には、コンパイラを選択する呼び出しの上に行を配置しない限り機能しませんでした。AC_PROG_CXX

これで、少し洞察が得られます。AC_PROG_CXX--coverage、 の配置が機能しGCOV_CFLAGSなかった理由である可能性が非常に高く、手遅れでした。

ログを注意深く見ると、秘密のソースは-lgcov、失敗したリンク手順に自動的に含まれているようです。このライブラリがそのような秘密である必要があるかどうかはわかりませんが、変数を次のように変更すると:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"

..にGCOV_LIBS含まれていることを確認LIBSしてから、すべてのプラットフォームですべて動作します。

編集:このスレッドも参照してください。

于 2012-07-28T18:45:53.200 に答える
1

より一般的な方法では、このエラーは、リンク コマンド ラインでライブラリが適切に順序付けされていることを確認することで修正できます。

于 2014-08-21T16:48:42.623 に答える