2009-02-24 20 views
5

Quando costruisco un progetto utilizzando un compilatore C++, posso assicurarmi che il file binario prodotto non sia influenzato se non ci sono state modifiche nel codice sorgente? Sembra che ogni volta che ricompongo la mia fonte, il checksum md5 del file binario sia influenzato. Il tempo di compilazione influenza in qualche modo il binario prodotto? Come posso produrre risultati di compilazione ripetibili?Generazione ripetibile di codice oggetto C++

+1

Forse quello che ti serve è un modo migliore per tenere traccia delle versioni oltre a md5 il binario? –

+0

Per cosa ti serve? Le build incrementali – jalf

risposta

1

Utilizzare un sistema di generazione incrementale, ad esempio make, per assicurarsi di non ricompilare il codice se la sorgente non cambia.

Potrebbe essere possibile ottenere la compilazione per creare binari identici dalla stessa origine, oppure potrebbe non farlo, dipende dal compilatore. La maggior parte incorporerà l'ora corrente nel binario generato da qualche parte.

+0

possono aggiungere dati aggiuntivi ai file oggetto che creeranno differenze. Invece, potresti voler usare una build non incrementale che costruisci da zero ogni volta. Controlla questo articolo MS: http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx – tguclu

+0

@tguclu Questo è un significato diverso incrementale rispetto al mio. Secondo la mia definizione, un sistema di build incrementale non fa differenza per gli oggetti di output: vengono solo ricostruiti solo se cambiano le loro fonti. –

2

Sospetto che dipenderà molto dalla tua toolchain e dal sistema operativo. Ad esempio, se una delle intestazioni eseguibili contiene un timestamp, troverai sempre che l'MD5 risultante è diverso.

Qual è il risultato finale che stai cercando di raggiungere (ovvero perché è così importante che siano identici) ..?

+0

Sto cercando risposte principalmente su Visual Studio e Xcode/gcc. Ricostruiamo il nostro prodotto su base giornaliera. Mi piacerebbe scoprire in modo affidabile quali modifiche sono state apportate tra due build. Posso farlo impostando alcuni flag nel compilatore/linker per non utilizzare le informazioni di timestamp quando si generano i binari? – user70336

+0

Non per quanto ne so. – Sean

3

Si può smontare i binari ed eseguire md5 sull'uscita

Esempio su MacOSX

otool -tV a.out | md5 
ee2e724434a89fce96aa6b48621f7220 

Ma, uno manca fuori sulla dati globali ... (potrebbe essere un parametro per includere anche)

sto rispondendo sul problema del md5 controllare un binario ... come gestire le vostre fonti e sistema di compilazione come altri hanno scritto su è anche una cosa da guardare

2

Non è possibile eseguire un confronto di checksum md5 per Visual Studio. Per un normale file di versione .exe di Visual Studio ci saranno 3 posizioni che cambiano ad ogni ricompilazione. 2 di questi sono timestamp e il terzo è un GUID univoco che Visual Studio utilizza per abbinare le versioni di .exe con i file helper per garantire che siano sincronizzati.

Potrebbe essere possibile scrivere uno strumento che azzeri i 3 campi di modifica, ma non sono sicuro di quanto sarebbe facile analizzare il file.

Inoltre, se si sta chiamando qualsiasi .dlls, se richiamo correttamente, si ottengono più identificatori univoci nel file generato.

La versione di debug è un'altra storia. Penso che ci siano molte, molte più differenze.