在使用带有gcov的libtool时出现“隐藏符号`atexit'被DSO引用”的错误

12

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

使用gcov进行代码覆盖测试。
GCOV_CFLAGS="-fprofile-arcs -ftest-coverage"
GCOV_LDFLAGS="-fprofile-arcs -ftest-coverage"

我的CFLAGSLDFLAGS被包含了进去。在OS X 10.7.4上使用g++-4.2(通过homebrew安装)一切正常。

但在使用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个回答

6
在谷歌上搜索后,我看到了这个帖子,建议在运行./configure时将--coverage添加到CXXFLAGS中。虽然对于那个发帖人来说没有用,但对我来说有效。
./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"

确保在LIBS中包含GCOV_LIBS,那么它就可以在我所有的平台上工作。

编辑:另请参见此线程


你是手动将这些 GCOV* 变量转换为其他变量,还是它们会自动包含在内?如果你要手动放置它们到其他变量中,你会放到哪里? - dbeer
实际上,看起来我的脚本的当前版本还有第三个功能。请查看 https://github.com/phs/sauce/blob/master/Makefile.am(请参见 configure.ac 中的 GCOV_ENABLED)。 - phs
1
这个注释是由“多余部门”的部门提供的。在编译时,“--coverage”相当于“-fprofile-arcs -ftest-coverage”,在链接时相当于“-lgcov”。 - Bulletmagnet

1
更通用的方法是,确保在链接命令行中正确排序您的库,以解决此错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接