Gcc &引用;隐藏符号“atexit';由DSO引用;将libtool与gcov一起使用时 我有一个C++项目,它使用GNU AutoToots用于其构建脚本和LIKoToT用于链接。最近,通过确保 GCOV_CFLAGS="-fprofile-arcs -ftest-coverage" GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"

Gcc &引用;隐藏符号“atexit';由DSO引用;将libtool与gcov一起使用时 我有一个C++项目,它使用GNU AutoToots用于其构建脚本和LIKoToT用于链接。最近,通过确保 GCOV_CFLAGS="-fprofile-arcs -ftest-coverage" GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage",gcc,ubuntu,linker,libtool,gcov,Gcc,Ubuntu,Linker,Libtool,Gcov,…分别包含在我的CFLAGS和LDFLAGS中。在使用g++-4.2(由自制软件安装)的OSX10.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

…分别包含在我的
CFLAGS
LDFLAGS
中。在使用g++-4.2(由自制软件安装)的OSX10.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上修复我的构建?

在谷歌搜索之后,我看到了,这建议在运行
/configure
时,将
--覆盖范围
添加到
cxflags
。事实上,虽然它对那张海报不起作用,但它对我起作用:

./configure CXXFLAGS="--coverage"
然而,这个变量是为软件包安装人员保留的,而不是为维护人员(me)保留的。问题归结为“如何将它正确地合并到构建中?”

以下是不足之处:

假设
GCOV\u CFLAGS
包含在有效的
cxflags
中(未显示,但它确实显示),似乎此修复程序应该可以工作。没有

进一步深入研究,如果我们从命令行中删除
cxflags=“--coverage”
,而将其放在
configure.ac
的某个地方,我们至少应该获得一些动力。实际上,这也不起作用,除非该行位于选择编译器的
AC_PROG_CXX
调用上方

现在我们了解了一些情况
AC_PROG_CXX
在看到
--覆盖范围时正在改变某些东西,这很可能是
GCOV\u CFLAGS
中的位置不起作用的原因:为时已晚

仔细查看日志,似乎秘密在于在失败的链接步骤中自动包含
-lgcov
。我不确定这个库是否需要保密,但如果我这样更改变量:

GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"
…并确保
GCOV_LIBS
包含在
LIBS
中,然后在我的所有平台上都能正常工作


编辑:另请参见。

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

您是手动将这些GCOV*变量转换为其他变量,还是自动将其包括在内?如果您手动将它们放入其他脚本中,您会将它们放入哪个脚本中?实际上,我的脚本的当前版本似乎还做了第三件事。请看一看(参见
configure.ac
了解
GCOV_ENABLED
)冗余部门给您带来的这条评论<代码>--覆盖率
相当于编译时的
-fprofile arcs-ftest覆盖率
,链接时的
-lgcov
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage --coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LIBS="-lgcov"