Libtool为目标文件添加了前缀,但gcov需要没有前缀的文件。

10

我需要使用gcov对我正在工作的共享库进行一些测试覆盖。

问题是libtool将对象文件从my-name.c重命名为libmylib_la-my-name.lo,而gcov无法处理该转换。每次运行它时,都会生成错误消息cannot open notes file

如果我在构建后手动将my-name.c重命名为libmylib_la-my-name.c,那么gcov就能正常工作,所以除了文件名混淆外,没有其他问题。

补充说明

尝试提供一个最小的可工作示例,我发现只有在设置lib..._la_CFLAGS时(并且还设置为空值时),才会发生文件名混淆。

cat <<EOT > configure.ac
AC_INIT(sample,0.0.1)
AC_CONFIG_SRCDIR(configure.ac)
AM_INIT_AUTOMAKE(foreign)
LT_INIT
AC_PROG_CC
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
EOT

cat <<EOT > Makefile.am
lib_LTLIBRARIES=libsample.la
libsample_la_SOURCES=sample.c
# The following line triggers the filename mangling (libsample_la-sample.lo instead of sample.lo)
libsample_la_CFLAGS=
EOT

touch sample.c && autoreconf -if && ./configure && make

有没有办法避免libtool进行的文件名混淆,或者让 gcov 理解文件名混淆方案?


没有你的Makefile.am很难诊断 - 你需要提供更多信息。 - Brett Hale
@Brett,好的,提供了示例项目。 - ntd
文件名混淆是由automake在使用每个目标编译标志时执行的。该信息(像往常一样)被埋藏在automake手册中。 - ntd
2个回答

6
Gcov的gcdagcno文件是以目标文件命名的。你可以直接在目标文件上运行gcov,也可以使用gcov-o选项来指定目标文件及其相应的gcov文件。
举个例子,我有一个构建共享库的小项目。我将gcov标志传递给make命令:
make CFLAGS="-O0 --coverage" LDFLAGS=--coverage

对象文件和相应的gcno文件会在src/.libs文件夹中创建:

$ ls -la src/.libs
libtest_la-test.o
libtest_la-test.gcno

源文件在src文件夹中。
$ ls src/
test.c

接下来我运行我的测试套件,会创建gcda文件:

$ ls -la src/.libs
libtest_la-test.o
libtest_la-test.gcno
libtest_la-test.gcda

现在我可以进入src目录并运行gcov,指定目标文件名:
$ gcov -o .libs/libtest_la-test.o test.c
File ‘test.c’
Lines executed:27.08% of 96
Creating ‘test.c.gcov'

你也可以仅在目标文件上运行 gcov

$ gcov .libs/libtest_la-test.o
File ’test.c’
Lines executed:27.08% of 96
Creating ’test.c.gcov'

甚至只需指定目标文件的基本名称和gcov文件即可:
$ gcov .libs/libtest_la-test
File ’test.c’
Lines executed:27.08% of 96
Creating ’test.c.gcov'

我建议使用另一种自动化方法来涵盖测试,这对我非常有效,使用lcov。我从顶级目录调用它,并指定源文件和目标文件的路径:

$ lcov --base-directory src --directory src/.libs/ --capture --output-file gcov.info
Capturing coverage data from src/.libs/
Found gcov version: 4.8.2
Scanning src/.libs/ for .gcda files ...
Found 10 data files in src/.libs/
Processing .libs/test_la-test.gcda
[…]
Finished .info-file creation

$ genhtml -o html/coverage gcov.info
Reading data file gcov.info
Found 10 entries.
Found common filename prefix "/usr/src/libtest”
Writing .css and .png files.
Generating output.
Processing file src/test.c
[…]
Writing directory view page.
Overall coverage rate:
  lines......: 56.1% (2098 of 3737 lines)
  functions..: 68.8% (139 of 202 functions)

现在,html/coverage目录包含可在Web浏览器中轻松分析的HTML文件。 lcov截图

1
Libtool 不应更改 .c 文件名。然而,它会更改 .o 文件名;这是因为它需要在某些平台上编译库两次(一次用于创建 .so(共享)库的位置无关代码(PIC),一次用于创建不是 PIC 的 .a(静态)库的代码)。
你可能看到的是 gcov 与共享库存在问题。有关详细信息,请参见 "can gcov deal with shared object?"。
如果这不能解决问题,我将同意 Brett 的观点,您需要提供更多信息。

这似乎是一个不同的问题:如果在构建之后我重命名我的测试源文件(例如,mv test.c libsample_la-test.c),一切都可以正常工作。 - ntd

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