Libtool 为对象添加前缀,但 gcov 要求它们没有前缀
Libtool prefixes objects but gcov requires them without prefix
我需要使用 gcov
在我正在处理的共享库上执行一些测试覆盖。
问题是 libtool
将目标文件从 my-name.c
重命名为 libmylib_la-my-name.lo
,而 gcov
无法处理该转换。每次我 运行 它,都会生成错误 cannot open notes file
。
如果我在构建 gcov
后手动将 my-name.c
重命名为 libmylib_la-my-name.c
,那么除了文件名修改之外没有其他问题。
附录
试图提供一个最小的工作示例,我发现只有在 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
理解文件名重整方案?
Libtool 不应更改 .c 文件名。但是,它确实 更改了 .o 文件名;这是因为它需要在某些平台上编译库两次(一次是为 .so(共享)库创建位置无关代码 (PIC),一次是为 .a(静态)库创建非 PIC 的代码)。
您可能看到的是 gcov
共享库存在问题。有关详细信息,请参阅“can gcov deal with shared object?”。
如果这不能解决问题,我将不得不同意 Brett 的意见,您需要提供更多信息。
Gcov gcda
和 gcno
文件以目标文件命名。您可以直接从源目录 运行 gcov
目标文件,或者您可以使用 gcov
的 -o
选项指定目标文件和相应的 gcov
文件。
例如,我有一个构建共享库的小项目。我传递 gcov
标志来执行命令:
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
目录包含 html 可以在网络浏览器中轻松分析的文件。
我需要使用 gcov
在我正在处理的共享库上执行一些测试覆盖。
问题是 libtool
将目标文件从 my-name.c
重命名为 libmylib_la-my-name.lo
,而 gcov
无法处理该转换。每次我 运行 它,都会生成错误 cannot open notes file
。
如果我在构建 gcov
后手动将 my-name.c
重命名为 libmylib_la-my-name.c
,那么除了文件名修改之外没有其他问题。
附录
试图提供一个最小的工作示例,我发现只有在 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
理解文件名重整方案?
Libtool 不应更改 .c 文件名。但是,它确实 更改了 .o 文件名;这是因为它需要在某些平台上编译库两次(一次是为 .so(共享)库创建位置无关代码 (PIC),一次是为 .a(静态)库创建非 PIC 的代码)。
您可能看到的是 gcov
共享库存在问题。有关详细信息,请参阅“can gcov deal with shared object?”。
如果这不能解决问题,我将不得不同意 Brett 的意见,您需要提供更多信息。
Gcov gcda
和 gcno
文件以目标文件命名。您可以直接从源目录 运行 gcov
目标文件,或者您可以使用 gcov
的 -o
选项指定目标文件和相应的 gcov
文件。
例如,我有一个构建共享库的小项目。我传递 gcov
标志来执行命令:
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
目录包含 html 可以在网络浏览器中轻松分析的文件。