当使用libtool和gcov时,“隐藏符号`atexit'被DSO引用”

时间:2012-07-28 18:45:53

标签: gcc ubuntu linker libtool gcov

我有一个C ++项目,它使用GNU Autotools构建脚本和libtool进行链接。最近我通过确保

添加了gcov的代码覆盖率检测
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"

..分别包含在我的CFLAGSLDFLAGS中。在使用g ++ - 4.2(由自制软件安装)的OS X 10.7.4上,一切正常。

在使用g ++ 4.6.3的Ubuntu 12.04上,libtool无法链接我的一个测试:

/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上修复构建?

2 个答案:

答案 0 :(得分:5)

在谷歌搜索后,我看到this thread,这表示在运行--coverage时将CXXFLAGS添加到./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,然后在我的所有平台上都能正常运行。

编辑:另请参阅this thread

答案 1 :(得分:0)

以更通用的方式,可以通过确保在链接命令行上正确排序库来修复此错误。