有人能告诉我 "Merge mismatch for summaries" 这个 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
/* 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:
CFLAGS := -fprofile-arcs -ftest-coverage
LDFLAGS := -fprofile-arcs -ftest-coverage
testexe: main.o stuff.o
$(CC) $(LDFLAGS) -o $@ $^
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 应只重新编译 stuff.c
并重新链接可执行文件。下次运行测试可执行文件时,main.gcda 文件会出现“Merge mismatch”消息。 stuff.gcda
文件不受影响,因为其对象文件已经用所有新的摘要信息重新创建。如果重新编译 main.c
并重新链接可执行文件,则错误消息消失。find . -name '*.gcda' | xargs rm
,但这并不是理想的解决方案。另一个解决方案是在使用分析数据时重新编译所有内容,“以防万一”,但这似乎有点过度了。