Libtool为对象添加前缀,但gcov要求它们没有前缀

ntd*_*ntd 8 c gcc autotools libtool gcov

我需要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
Run Code Online (Sandbox Code Playgroud)

有没有办法避免libtool操作的文件名修改或让我们gcov理解文件名修改方案?

baf*_*baf 5

Gcov gcda和gcno文件以目标文件命名。您可以gcov从源目录直接在目标文件上运行,也可以使用-o选项gcov指定目标文件和相应的gcov文件。

例如,我有一个构建共享库的小项目。我通过gcov标志来发出命令:

make CFLAGS="-O0 --coverage" LDFLAGS=--coverage
Run Code Online (Sandbox Code Playgroud)

gcno在src/.libs文件夹中创建目标文件和相应的文件:

$ ls -la src/.libs
libtest_la-test.o
libtest_la-test.gcno
Run Code Online (Sandbox Code Playgroud)

源文件在src文件夹中

$ ls src/
test.c
Run Code Online (Sandbox Code Playgroud)

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

$ ls -la src/.libs
libtest_la-test.o
libtest_la-test.gcno
libtest_la-test.gcda
Run Code Online (Sandbox Code Playgroud)

现在,我可以输入src目录并运行gcov,指定目标文件名:

$ gcov -o .libs/libtest_la-test.o test.c
File ‘test.c’
Lines executed:27.08% of 96
Creating ‘test.c.gcov'
Run Code Online (Sandbox Code Playgroud)

也可以只gcov在目标文件上运行:

$ gcov .libs/libtest_la-test.o
File ’test.c’
Lines executed:27.08% of 96
Creating ’test.c.gcov'
Run Code Online (Sandbox Code Playgroud)

甚至只是指定目标文件和gcov文件的基本名称:

$ gcov .libs/libtest_la-test
File ’test.c’
Lines executed:27.08% of 96
Creating ’test.c.gcov'
Run Code Online (Sandbox Code Playgroud)

但是我建议使用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)
Run Code Online (Sandbox Code Playgroud)

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

lcov屏幕截图