12

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

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

..分别包含在我的CFLAGSLDFLAGS中。在使用 g++-4.2(由 homebrew 安装)的 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 上的构建?

4

2 回答 2

6

谷歌搜索后,我看到了这个线程,它建议--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,这很可能是放置 inGCOV_CFLAGS不起作用的原因:为时已晚。

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

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

..并确保GCOV_LIBS包含在 中LIBS,然后一切正常,在我所有的平台上。

编辑:另见此线程

于 2012-07-28T18:45:53.200 回答
1

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

于 2014-08-21T16:48:42.623 回答