GCOVでlibtoolを使用する場合、「隠しシンボル `atexit 'はDSOによって参照されます。

StackOverflow https://stackoverflow.com//questions/11703709

質問

ビルドスクリプトとlibtoolのためにGNU Autotoolsを使用するC ++プロジェクトを持っています。最近私は

を確実にすることによって、GCOVとのコードカバレッジ計測器を追加しました
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
.

..私のCFLAGSLDFLAGSに含まれます。OS X 10.7.4 G ++の使用 - 4.2(HomeBrewによるインストール)、すべてがうまく機能します。

Ubuntu 12.04 G ++ 4.6.3を使用して、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のビルドを修正するにはどうすればよいですか?

役に立ちましたか?

解決

グーグルの後、私はこのスレッドこれは、--coverageを実行するときにCXXFLAGSへの./configureを追加することを示唆しています。確かに、それはそのポスターのために働かなかったが、それは私のために働く:

./configure CXXFLAGS="--coverage"
.

しかし、この変数は、メンテナ(ME)ではなく、パッケージインストーラ用に予約されています。この質問は「これを正しく構築に組み込むにはどうすればよいですか?」

これはではありません十分なもの:

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="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"
.

..そしてGCOV_CFLAGS-lgcovに含まれていることを確認し、それはすべての私のプラットフォームですべて機能します。

編集このスレッド

他のヒント

より一般的な方法では、このエラーは、ライブラリがリンクコマンドラインで正しく注文されていることを確認することで修正できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top