Cela se produit lorsque l'un des objets que vous liez dans un exécutable change de manière significative. Par exemple, il gagne ou perd quelques lignes de code profilable.
Le cas minimal pour produire l'erreur est avec 2 fichiers source. Voici les 2 fichiers source exemple appelé main.c ...
/* main.c */
int do_stuff(int value);
int main(int argc, const char *argv[])
{
do_stuff(argc);
return 0;
}
et 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;
}
Ce qu'ils font est pas important. Pour les construire, voici un Makefile simple:
CFLAGS := -fprofile-arcs -ftest-coverage
LDFLAGS := -fprofile-arcs -ftest-coverage
testexe: main.o stuff.o
$(CC) $(LDFLAGS) -o [email protected] $^
Le Makefile est mis en place afin que la compilation est main.c -> main.o
, stuff.c -> stuff.o
et enfin stuff.o + main.o -> testexe
. Si nous compilons et lions ces fichiers C avec les options -fprofile-arcs -ftest-coverage
alors le fichier exécutable a profilage. Exécutez cette execuatable et vous obtiendrez 2 fichiers de sortie, et stuff.gcda
. Jusqu'ici tout va bien.
Maintenant, changez la ligne #if 0
en #if 1
. Le Makefile devrait provoquer juste recompiler stuff.c, et l'exécutable à relier. La prochaine fois que vous exécuterez l'exécutable de test, vous obtiendrez le message "Fusionner les erreurs" pour le fichier main.gcda. Le fichier stuff.gcda n'est pas affecté puisque son fichier objet a été recréé avec toutes les nouvelles informations de résumé. Si vous recompilez main.c
et reliez l'exécutable, le message d'erreur disparaît.
Alors, que peut-on faire? J'aimerais savoir! En ce moment je cours find . -name '*.gcda' | xargs rm
chaque fois que j'ai besoin de re-vérifier la couverture, ce qui n'est pas vraiment idéal. Une autre solution serait de tout recompiler en utilisant le profilage "au cas où", mais cela semble être trop.
Super, merci pour l'information! C'est bien de comprendre enfin ce qui se passe ici. Excellente explication aussi. J'ai eu une solution de contournement similaire - pour supprimer tous les fichiers générés avant de courir. Je comprends maintenant pourquoi cela fonctionne mais je pense que le message d'erreur pourrait être amélioré quelque peu. – mikelong