2009-08-03 4 views
6

Ich habe 3 Maschinen bauen. Eine läuft auf Windows 2000, eine mit XP SP3 und eine mit 64bit Windows Server 2008. Und ich habe ein natives C++ Projekt zu bauen (ich baue mit Visual Studio 2005 SP1). Mein Ziel ist es, "genau" die gleichen DLLs mit diesen Build-Maschinen zu bauen.Identische Build auf verschiedenen Systemen

Mit genau meine ich Stück für Stück (außer Build Timestamp natürlich).

Mit win2k und winxp bekomme ich identische DLLs. Aber sie unterscheiden sich von DLL mit Win2008 Server gebaut. Ich habe es geschafft, fast identische DLLs zu bekommen, aber es gibt einige Unterschiede. Nach dem Zerlegen der Dateien habe ich festgestellt, dass die Reihenfolge der Funktionen nicht gleich ist (3 Funktionen sind in einer anderen Reihenfolge).

Weiß jemand, was könnte der Grund dafür sein?

Und eine Nebenfrage: In vcbuild.exe habe ich einen Schalter/ORDER gefunden. Welches nimmt Funktionsauftragsdatei als Eingabe. Weiß jemand, wie diese Datei aussehen soll?

+0

Haben Sie versucht, VS im 32-Bit-Kompatibilitätsmodus (oder wie auch immer es genannt wird) auszuführen? – Makis

+0

Es muss in 32-Bit-Compat ausgeführt werden, gibt es keine 64-Bit-Version von Visual Studio AFAIK – ppiotrowicz

+1

1. Ist der Server 2008-Computer eine andere CPU ausgeführt? (Ich habe einmal ein ähnliches Problem gesehen, bei dem eine AMD-Maschine eine etwas andere Ausgabe als INTEL produzierte - komisch, aber wahr). 2. Haben Sie die installierten Updates überprüft, um festzustellen, ob dort Änderungen an VS-Komponenten vorgenommen wurden? –

Antwort

7

Sie könnten denken, dass das Kompilieren rein deterministisch ist (identische Eingaben geben jedes Mal eine identische Ausgabe), aber das muss nicht der Fall sein. Betrachten Sie zum Beispiel den Optimierer - dies wird etwas Arbeitsspeicher benötigen, wahrscheinlich mehr für höhere Optimierungsmethoden. Wenn auf einer Maschine eine Speicherzuordnung fehlschlägt (weil die Maschine weniger Speicher hat), könnte der Compiler diese spezifische Optimierung auslassen, was dazu führt, dass anderer Code ausgegeben wird.

Es gibt viele ähnliche Situationen, so dass Sie eine Menge Mühe in etwas investieren können, das nicht machbar ist. Warum brauchen Sie die DLLs trotzdem bitweise identisch?

+0

Mit Optimierungen ausgeschaltet (/ Od-Schalter) habe ich das gleiche Problem. Bitweise Gleichheit ist in diesem Projekt entscheidend (kann nicht wirklich warum diskutieren, sorry). – ppiotrowicz

+2

Die Optimierung Sache war nur ein Beispiel - es gibt viele Dinge, die den Compiler verschiedene Ausgabe produzieren könnte. –

0

Haben Sie die gleiche Version des Kettenwerkzeugs (Compiler, Linker, ...), inklusive 32/64 Bits Unterschied?

+0

Ja, ich bin mit VS2005 mit SP1 überall (. NET 2.0 SP1 ist auch installiert). Gebäude zu Win32-Plattform. – ppiotrowicz

+0

Sind Sie sicher, dass Sie 32-Bit-Version des Compilers und den Linker auf Win2008 verwenden? – AProgrammer

+0

Ja, da bin ich mir sicher. Sie sind in Programmdateien (x86) – ppiotrowicz

0

Ist Windows Server 2008 die einzige Maschine mit 64 Bit? Wenn ja, könnte das dein Problem sein.

+0

Es könnte sein, aber DLLs von 32bit-Systemen sind fast identisch. Der einzige Unterschied ist, dass _3_ Funktionen in einer anderen Reihenfolge sind (und es gibt viele Funktionen im Projekt). Disasmbly-Code ist fast gleich. – ppiotrowicz