gcov警告:摘要合并不匹配
谁能告诉我gcov消息“汇总合并不匹配”是什么意思?我在gcc源代码中找到了以下消息:gcov警告:摘要合并不匹配,c,gcc,gcov,C,Gcc,Gcov,谁能告诉我gcov消息“汇总合并不匹配”是什么意思?我在gcc源代码中找到了以下消息: 检查.gcda文件中的标记是否匹配似乎是明智之举,但我不确定。有人知道如何解决这个问题吗?当链接到可执行文件的对象发生重大变化时,就会发生这种情况。例如,它获得或丢失了一些可盈利代码行 产生错误的最小情况是使用2个源文件。下面是两个名为main.c的示例源文件 /* main.c */ int do_stuff(int value); int main(int argc, const char *argv
检查
.gcda
文件中的标记是否匹配似乎是明智之举,但我不确定。有人知道如何解决这个问题吗?当链接到可执行文件的对象发生重大变化时,就会发生这种情况。例如,它获得或丢失了一些可盈利代码行
产生错误的最小情况是使用2个源文件。下面是两个名为main.c的示例源文件
/* main.c */
int do_stuff(int value);
int main(int argc, const char *argv[])
{
do_stuff(argc);
return 0;
}
等等
/* stuff.c */
#include <stdio.h>
#if 0
int more_stuff()
{
int i;
i = 0;
return i;
}
#endif
int do_stuff(int value)
{
if (value > 1) {
printf("Value > 1\n");
} else {
printf("Value <= 1\n");
}
return 0;
}
Makefile设置为编译为main.c->main.o
,stuff.c->stuff.o
,最后是stuff.o+main.o->testexe
。如果我们使用-fprofile arcs-ftest coverage
选项编译并链接这些C文件,那么可执行文件就具有评测功能。运行这个可执行文件,您将得到两个输出文件,main.gcda
和stuff.gcda
。到目前为止还不错
现在将行#if 0
更改为#if 1
。Makefile应该使just stuff.c重新编译,并使可执行文件重新链接。下次运行测试可执行文件时,您将得到main.gcda文件的“合并不匹配”消息。stuff.gcda文件不受影响,因为已使用所有新的摘要信息重新创建其对象文件。如果重新编译main.c
并重新链接可执行文件,则错误消息将消失
那么我们能做些什么呢?我很想知道!现在我运行
find-每当我需要重新检查覆盖范围时,请命名“*.gcda”| xargs rm
,这并不理想。另一个解决方案是在使用评测“以防万一”时重新编译所有内容,但这似乎有些过分。太好了,谢谢您提供的信息!很高兴终于明白这里发生了什么。很好的解释。我有一个类似的解决方法——在运行之前删除所有生成的文件。我现在明白了为什么会这样,但我认为错误信息可以有所改进。
CFLAGS := -fprofile-arcs -ftest-coverage
LDFLAGS := -fprofile-arcs -ftest-coverage
testexe: main.o stuff.o
$(CC) $(LDFLAGS) -o $@ $^