Delphi Compile und Build Produce Producing Producy bei demselben Projekt unterschiedliche Binärdienste

StackOverflow https://stackoverflow.com/questions/2013312

Frage

In einer frischen VCL -Anwendung Kompilieren und Bauen Die Operation erzeugt die gleiche binäre und die Kartendatei (mit geringfügigen Unterschieden am Ende der .exe -Datei, auch wenn die Option "Versionsinformationen in Projekt integrieren" ausgeschaltet ist - bereits besprochen). Die Kartendatei ist das gleiche Byte zu Byte. Aber wen füge ich eine beliebige Komponente von Drittanbietern hinzu. Die von Build und Compile erzeugte Binär- und Kartendatei (!) Unterscheiden sich erheblich unterschiedlich!

Getestet auf zwei Versionen von Delphi:
- Version 7.0 (Build 8.1)
- Codegear ™ RAD Studio 2007 Version 11.0.2902.10471 (+Dezember 2007 Update)

Schritt zu reproduzieren:

  1. Erstellen Sie eine neue VCL -Anwendung. Fügen Sie möglicherweise eine native Delphi -Komponente hinzu (ich versuche alle Komponenten von StandArt, zusätzlich, win32 und System -Registerkarte).
  2. Schalten Sie eine detaillierte Kartendatei auf der Registerkarte Linker der Projektoptionen ein.
  3. Projekt erstellen.
  4. Benennen Sie die Ausgabe .exe und.
  5. Projekt kompilieren.
  6. Benennen Sie die Ausgabe .exe und.
  7. Vergleichen Sie Dateien aus Schritt 4 und 6. (Ich verwende Winmerge 2.12.4.0).

Wir haben wenig andere .exe -Dateien und vollständig identische .map -Dateien. Wenn wir dann alle Schritte wieder wiederholen, aber in der Project-Drittanbieterkomponente (ich versuche ODAC, DOA, Devexpress und selbstgemacht), erhalten wir mehr andere .exe und verschiedene .map-Dateien.

Wieso den? Irgendwelche Vorschläge?

AKTUALISIEREN
Einige Informationen darüber, wie ich das gefunden habe und warum es mich interessiert:
Das Projekt wird aus einem einfachen Skript mit MSBuild erstellt. Wenn im Projekt Übersetzung durch ITE (DLL mit Ressourcen) hinzugefügt wurde Taste, Beschriftungen). Wenn das Projekt aus der IDE zusammengestellt wird, ist alles in Ordnung. Also fange ich an, Build zu vergleichen und die Ausgabe zu kompilieren ...

War es hilfreich?

Lösung

Was Sie sehen, ist einfach ein Artefakt des eingebauten Make-Logiks des Compilers. Wenn Sie einen Build durchführen, wird der Compiler angegeben, alle verfügbaren Quellen zu erstellen. Daher verarbeitet Delphi jede Quelldatei und für jedes Gerät in den Verwendungslisten, für die sie Quelle findet, wird diese Datei erstellt. Dies tut dies rekursiv. Wenn Sie ein Kompilieren durchführen, werden nur die vorhandenen .dcu-Dateien geladen, und wenn sie sich als aktuell befinden, wird nichts getan. Dies kann tatsächlich zu einer anderen Reihenfolge führen, in der die Einheiten entdeckt werden, da jede .dcu die Verwendungsliste effektiv "verflacht". Da die Einheiten in einer anderen Reihenfolge entdeckt und geladen werden, sind sie in einer anderen Reihenfolge verknüpft. Aus diesem Grund sehen Ihre Kartendateien so unterschiedlich aus. Bei den gleichen Quellen sollte die Kartendatei gleich sein, wenn Sie zwei Builds in ein oder zwei Compiles in einer Reihe durchführen.

Andere Ursachen für Unterschiede sind banaler und umfassen Dinge wie die PE -Header -Zeitstempel und andere Polster- und Ausrichtungsstücke.

Andere Tipps

Es gibt zwei Teile in dieser Antwort, glaube ich.

Ein Teil des Problems, das Ihr Sehen, IIRC, ist, dass der Compiler vor einem Kompilieren/Build keinen Speicher ausführt. Somit wird alles, was im nicht initialisierten Speicher übrig ist, zu Ausgangszwecken zum Füllstoff in der Ausgabe.

Ich erinnere mich auch daran, dass in den PE -Header -Informationen für die Anwendung eine Zeitstempel des Datums enthalten ist. Das wird jedes Mal einen Unterschied verursachen.

Ich bin nicht die beste Person, um dies zu bestätigen, aber ich erinnere mich aus früheren Diskussionen anscheinend.

Leute wie Allen Bauer oder Barry Kelly könnten wahrscheinlich bessere/genauere Informationen dazu geben.

Wenn Sie Compiler Defines in Ihrem Projekt verwenden und diese nur geändert haben, sehen Sie keine Änderungen an der DCU und dem resultierenden Modul (EXE oder DLL). Wenn Sie einen vollständigen Wiederaufbau durchführen, werden der Compiler -Definieren in den neu erstellten DCUs und Modulen verwendet.

Ich habe dies in einer großen Projektgruppe gesehen, in der wir Module in verschiedenen Projekten mit unterschiedlichen Definieren verwenden und alle DCUs im selben Verzeichnis gespeichert werden.

ERGO: Der Compiler erzwingt die Abhängigkeiten von den Definieren in diesem Fall nicht.

Vielleicht haben Sie das gleiche Problem gesehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top