当使用libcool和gcov时,“DSO引用了隐藏的符号”atexit“

我有一个C ++项目,它使用GNU Autotools的构build脚本和libtool进行链接。 最近我通过确保gcov添加了代码覆盖检测

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

..get分别包含在我的CFLAGSLDFLAGS 。 在OS X 10.7.4使用g ++ – 4.2(由homebrew安装),一切工作正常。

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

 /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 

如何解决我的构build在Ubuntu / G + + 4.6?

搜索后,我看到这个线程 ,这意味着在运行./configure时添加 – --coverageCXXFLAGS 。 事实上,虽然它不适用于这张海报,但对我来说却很有效:

 ./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 ,然后在我所有的平台上运行。

编辑 :另见这个线程 。

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