使用的libtool与gcov的当“隐藏符号的atexit`”由DSO引用”(“Hidden sym

2019-06-26 14:26发布

我有一个使用GNU自动为其构建脚本和libtool用于链接C ++项目。 最近我加入的gcov代码覆盖率的仪器,通过确保

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

..get包含在我的CFLAGSLDFLAGS分别。 在使用G ++ OS X 10.7.4 - 4.2(通过自制安装),一切工作正常。

在Ubuntu 12.04使用G ++ 4.6.3,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编译?

Answer 1:

周围的Googling后我看到这个线程 ,这表明增加--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 ,那么它所有的作品,我的所有平台。

编辑 :又见这个线程 。



Answer 2:

在一个更通用的方式,这种错误可以通过确保您的库您的链接命令行上正常有序进行固定。



文章来源: “Hidden symbol `atexit' is referenced by DSO” when using libtool with gcov