Ciò accade quando uno degli oggetti che si collega a un eseguibile cambia in modo significativo. Ad esempio, guadagna o perde alcune linee di codice profilabile.
Il caso minimo per produrre l'errore è con 2 file di origine. Qui ci sono 2 file di esempio source chiamato main.c ...
/* main.c */
int do_stuff(int value);
int main(int argc, const char *argv[])
{
do_stuff(argc);
return 0;
}
e 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;
}
Quello che fanno non è importante. Per costruire loro, ecco un semplice Makefile:
CFLAGS := -fprofile-arcs -ftest-coverage
LDFLAGS := -fprofile-arcs -ftest-coverage
testexe: main.o stuff.o
$(CC) $(LDFLAGS) -o [email protected] $^
Il Makefile è impostato in modo che la compilazione è main.c -> main.o
, stuff.c -> stuff.o
e infine stuff.o + main.o -> testexe
. Se compiliamo e colleghiamo questi file C con le opzioni -fprofile-arcs -ftest-coverage
, il file eseguibile ha il profilo. Esegui quello eseguibile e otterrai 2 file di output, main.gcda
e stuff.gcda
. Fin qui tutto bene.
Ora modificare la riga #if 0
a #if 1
. Il Makefile dovrebbe solo ricompilare stuff.c e l'eseguibile da ricollegare. La prossima volta che eseguirai il test eseguirai il messaggio "Unisci mismatch" per il file main.gcda principale. Il file stuff.gcda non è interessato dal momento che il suo file oggetto è stato ricreato con tutte le nuove informazioni di riepilogo. Se si ricompila main.c
e ricollega l'eseguibile, il messaggio di errore scompare.
Quindi cosa si può fare? Mi piacerebbe saperlo! Al momento eseguo find . -name '*.gcda' | xargs rm
ogni volta che ho bisogno di ricontrollare la copertura, che non è proprio l'ideale. Un'altra soluzione sarebbe quella di ricompilare tutto quando si utilizza la profilatura "just in case", ma sembra eccessivo.
Grande, grazie per l'informazione! È bello capire finalmente che cosa sta succedendo qui. Ottima spiegazione anche. Ho avuto una soluzione simile: per eliminare tutti i file generati prima dell'esecuzione. Ora capisco perché funziona, ma penso che il messaggio di errore potrebbe essere leggermente migliorato. – mikelong