Kann ich beim Erstellen eines Projekts mit einem C++ - Compiler sicherstellen, dass die erstellte Binärdatei nicht betroffen ist, wenn der Quellcode nicht geändert wurde? Es sieht so aus, als ob jedes Mal, wenn ich meine Quelle neu kompiliere, die MD5-Prüfsumme der Binärdatei betroffen ist. Beeinflusst die Zeit der Kompilation irgendwie die produzierte Binärdatei? Wie kann ich wiederholbare Zusammenstellungsergebnisse erzeugen?Wiederholbare Objektcode-Generierung C++
Antwort
Verwenden Sie ein inkrementelles Buildsystem - wie make
, um sicherzustellen, dass Sie Ihren Code nicht neu kompilieren, wenn sich die Quelle nicht ändert.
Es kann möglich sein, Ihre Kompilierung zu bekommen, um identische Binärdateien aus der gleichen Quelle zu machen - oder es kann nicht sein - es hängt vom Compiler ab. Die meisten werden die aktuelle Zeit irgendwo in die generierte Binärdatei einbetten.
Inkrementelle Builds können zusätzliche Daten an Ihre Objektdateien anhängen, was zu Unterschieden führt. Stattdessen sollten Sie nicht inkrementelles Build verwenden, das jedes Mal neu erstellt wird. Überprüfen Sie diesen MS-Artikel: http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx – tguclu
@ tguclu Das ist eine andere Bedeutung von inkrementellen als meine. Nach meiner Definition macht ein inkrementelles Build-System für die Ausgabeobjekte keinen Unterschied: Sie werden nur neu erstellt, wenn sich ihre Quellen ändern. –
Ich vermute, dass es stark von Ihrer Toolchain und OS abhängen wird. Wenn beispielsweise einer der ausführbaren Header einen Zeitstempel enthält, werden Sie immer feststellen, dass das resultierende MD5 anders ist.
Was ist das Endergebnis, das Sie erreichen möchten (dh warum ist es so wichtig, dass sie identisch sind) ..?
Ich suche Antworten hauptsächlich auf Visual Studio und Xcode/gcc. Wir bauen unser Produkt täglich neu auf. Ich würde gerne herausfinden, welche DLLs sich zwischen zwei Builds geändert haben. Kann ich dies tun, indem ich einige Flags im Compiler/Linker setze, um beim Erzeugen von Binärdateien keine Timestamp-Informationen zu verwenden? – user70336
Nicht so weit ich weiß. – Sean
Man kann die Binärdateien zerlegen und md5 am Ausgang
Beispiel auf MacOSX
otool -tV a.out | md5
ee2e724434a89fce96aa6b48621f7220
Aber man verpasst die globalen Daten laufen ... (könnte ein Parameter enthalten sein)
ich bin auf das Problem der md5 Beantwortung einer binären Überprüfung ... wie Sie Ihre Quellen und Build-System zu verwalten als andere über auch eine Sache bei
zu suchen ist geschriebenSie können keinen MD5-Prüfsummenvergleich für Visual Studio durchführen. Für eine normale Release-Version .exe-Datei von Visual Studio gibt es drei Standorte, die sich mit jeder Neukompilierung ändern. 2 davon sind Zeitstempel und die dritte ist eine eindeutige GUID, die Visual Studio verwendet, um Versionen der .exe mit Hilfsdateien abzustimmen, um sicherzustellen, dass sie synchronisiert sind.
Es könnte möglich sein, ein Werkzeug zu schreiben, das die 3 sich ändernden Felder auf Null setzt, aber ich bin mir nicht sicher, wie einfach es wäre, die Datei zu parsen.
Auch, wenn Sie eine .dlls aufrufen, wenn ich mich recht erinnere, erhalten Sie mehr eindeutige Bezeichner in der generierten Datei.
Die Debug-Version ist eine andere Geschichte. Ich denke, es gibt viele, viele weitere Unterschiede.
- 1. Wiederholbare Mustererkennung
- 2. WSDL generiert wiederholbare Build
- 3. TensorFlow: Nicht-wiederholbare Ergebnisse
- 4. MailChimp Vorlage: Verschachtelte wiederholbare Varianten?
- 5. Wiederholbare Builds aus demselben C# -Quellcode auf verschiedenen Maschinen
- 6. Wiederholbare ID-Konflikte auf Python-Objekten
- 7. Mailchimp wiederholbare Blöcke sortieren Reihenfolge setzt
- 8. Read Committed Vs wiederholbare Lesevorgänge in MySQL?
- 9. Stabile/wiederholbare zufällige Sortierung (MySQL, Rails)
- 10. Wie wiederholbare Unit-Tests von Code, der mit Thread.interrupt funktioniert?
- 11. Wie kann ich eine wiederholbare Signatur einer Datenstruktur erstellen?
- 12. So entfernen Sie wiederholbare Tasten, Tastenvorschau der benutzerdefinierten Android-Tastatur
- 13. Wiederholbare Lese-Isolationsstufe sperrt alle Tabellen für die Aktualisierung?
- 14. In Django, wie wiederholbare Lesevorgänge für eine Transaktion zu erreichen?
- 15. Wie analysiere ich eine wiederholbare Option mit zwei Argumenten mit Pythons Argparse?
- 16. C/C++/Objective-C-Texterkennungsbibliothek
- 17. Differenz zwischen scanf ("% c", & c) und scanf ("% c", & c)
- 18. Eye-Tracking-Bibliothek in C#, C/C++ oder Objective-C
- 19. Matlab in C C++ und C C++ in Matlab
- 20. C/C++/C#/VB-basierte Lexikalische Analysatoren
- 21. virtuelle Datei? in c/C++ oder C#
- 22. main() in C, C++, Java, C#
- 23. C/C++/C# SetWindowPos: Fenster über anderen
- 24. Einführung in C# für C/C++ - Benutzer
- 25. Natives C++ zu verwaltetes C++ zu C#
- 26. statisches Array in C# vs C/C++
- 27. Externe C/C++ - Bibliothek nicht in C#
- 28. Testcode in C C++
- 29. C++ Union in C#
- 30. typedef wie C/C++
Vielleicht, was Sie brauchen, ist eine bessere Möglichkeit, Versionen neben MD5 die Binärdatei zu verfolgen? –
Wozu brauchst du das? – jalf