gcov警告:摘要合并不匹配

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

谁能告诉我gcov消息“汇总合并不匹配”是什么意思?我在gcc源代码中找到了以下消息:


检查
.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 $@ $^