Domanda

In una nuova domanda VCL Compila e Crea il funzionamento producono lo stesso file binario e mappa (con piccole differenze alla fine del file exe anche se "includono le informazioni sulla versione nel progetto" opzione è disattivata - già discusso). file di mappa è lo stesso byte per byte. Ma wen aggiungo qualsiasi componente di terze parti del binario e mappa (!) Di file prodotto da Costruire e Compile sono significativamente diversi!

provata su due versioni di Delphi:
 - Versione 7.0 (Build 8.1)
 - CodeGear ™ RAD Studio 2007 Versione 11.0.2902.10471 (+ Aggiornamento di dicembre 2007)

Passaggio a riprodurre:

  1. Crea nuovo VCL applicazione. Forse aggiungere qualsiasi componente nativo di Delphi (provo tutti i componenti dalla Standart, Ulteriori scheda, Win32 e sistema).
  2. Accendere lima cartina dettagliata sulla scheda Linker delle Opzioni progetto.
  3. Crea progetto .
  4. Rinomina exe di output e file MAP (ad esempio: project1.exe per project1b.exe e project1.map a project1b.map).
  5. Compila progetto .
  6. Rinomina exe di output e file MAP (ad esempio: project1.exe per project1c.exe e project1.map a project1c.map).
  7. Confronta i file dal punto 4 e 6. (io uso WinMerge 2.12.4.0).

Abbiamo piccoli file .exe diversi e file .map completamente identici. Poi se ripetiamo ancora una volta tutti i passi, ma utilizzare nella componente del progetto di terze parti (provo ODAC, DOA, DevExpress e selfmade) otteniamo .exe più diversi e diversi file .map.

Perché? Qualche suggerimento?

Aggiorna
Alcuni dati su come ho trovato questo e perché è mi interessa:
Progetto è costruire dal semplice script con MSBuild. Quando nel progetto di traduzione è stato aggiunto attraverso ITE (DLL con le risorse) ho scoperto che quando il progetto è stato costruito (da script o da IDE) - tradotto sbagliato versione di lavoro - un testo sul pulsante, etichette ecc ottenuto dal posto sbagliato (letteralmente da un altro pulsante, etichette). Quando progetto compilato da IDE - tutto è ok. Così ho iniziare paragono Costruire e la determinazione della produzione ...

È stato utile?

Soluzione

Quello che stai vedendo è semplicemente un artefatto della logica make built-in del compilatore. Quando si esegue una build, si dice al compilatore di costruire tutte le fonti disponibili. Così Delphi elabora ogni file di origine e per ogni unità nelle liste usi per i quali si trova la fonte, sarà poi costruire quel file. Lo fa in modo ricorsivo. Quando si esegue una compilazione, solo i file esistenti .dcu vengono caricati e se sono trovati ad essere up-to-date, non si fa nulla. Questo può effettivamente portare ad un ordine diverso in cui le unità vengono scoperti dal momento che ogni .dcu sarà effettivamente "appiattire" la lista usi. Poiché le unità vengono rilevati e caricati in un ordine diverso, sono in-turn, collegato in un ordine diverso. Questo è il motivo per cui i file mappa appaiono così diversi. Date le stesse fonti, il file di mappa dovrebbe essere lo stesso se lo fai due costruisce in una riga o due compilazioni di fila.

Altre cause per le differenze sono più banale e includono cose come l'intestazione PE ora, e altri pezzi di imbottitura e allineamenti.

Altri suggerimenti

Ci sono due parti a questa risposta credo.

Una parte del problema vostro vedere, IIRC, è che il compilatore non azzerare la memoria prima di fare una compilazione / build. Così nulla lasciato in memoria non inizializzata diventa riempitivo in uscita per scopi di allineamento.

Mi sembra anche di ricordare che c'è un timbro di data e ora incluse nelle informazioni di intestazione pe per l'applicazione. che causerà la differenza ogni volta.

Io non sono la persona migliore per confermare questo, ma questo è quello che mi sembra di ricordare dalle discussioni del passato.

La gente come Allen Bauer o Barry Kelly sarebbe probabilmente in grado di dare una migliore informazione / più precise su questo.

Se si utilizza il compilatore definisce nel progetto e quelli appena cambiato, se si fa una compilazione, non vedrete alcuna modifica al DCU di e il modulo risultante (exe o dll). Se un full ricostruire le definisce compilatore vengono utilizzati nei appena creati DCU di e moduli.

Ho visto questo in un grande gruppo di progetto in cui usiamo i moduli in diversi progetti con diversi definisce e tutti DCU di sono memorizzati nella stessa directory.

Ergo:. Il compilatore non rispettare le dipendenze sulle definisce in questo caso

Forse avete visto lo stesso problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top