Pregunta

En una nueva aplicación VCL Compilar y Construir La operación produce el mismo archivo binario y de mapa (con diferencias menores al final del archivo .exe, incluso si la opción "Incluir información de la versión en el proyecto" está apagada, ya se discute). El archivo de mapas es el mismo byte a byte. ¡Pero cuando agrego cualquier componente de terceros, el archivo binario y el mapa (!) Producido por compilar y compilar son significativamente diferentes!

Probado en dos versiones de Delphi:
- Versión 7.0 (construir 8.1)
- Codegear ™ Rad Studio 2007 Versión 11.0.2902.10471 (+Diciembre de 2007 Actualización)

Paso para reproducir:

  1. Crear nueva aplicación VCL. Posiblemente agregue cualquier componente Delphi nativo (pruebo todos los componentes de Standart, adicional, Win32 y la pestaña del sistema).
  2. Encienda el archivo de mapa detallado en la pestaña de enlace de las opciones del proyecto.
  3. Proyecto de construcción.
  4. Cambiar el nombre de salida .exe y el archivo .map (por ejemplo: Project1.exe a Project1b.exe y Project1.map a Project1b.map).
  5. Proyecto de compilación.
  6. Cambie el nombre de salida .exe y .map (por ejemplo: Project1.exe a Project1c.exe y Project1.map a Project1C.Map).
  7. Compare archivos del paso 4 y 6. (Utilizo WinMerge 2.12.4.0).

Tenemos pequeños archivos .exe diferentes y archivos .map completamente idénticos. Luego, si repetimos todos los pasos nuevamente, pero lo usamos en el componente de terceros del proyecto (intento ODAC, DOA, DeVexpress y SelfMade), obtenemos más archivos .exe y diferentes .map.

¿Por qué? ¿Alguna sugerencia?

ACTUALIZAR
Alguna información sobre cómo encontré esto y por qué me interesa:
El proyecto se construye a partir de un script simple con msbuild. Cuando en el proyecto se agregó la traducción a través de (dll con recursos) descubrí que cuando el proyecto se construyó (desde el script o desde IDE) - la versión traducida funciona mal - algún texto en el botón, etiquetas, etc. obtuvo el lugar incorrecto (literalmente de otro botón, etiquetas). Cuando el proyecto compilado de IDE, todo está bien. Entonces comienzo a comparar la salida de compilación y compilar ...

¿Fue útil?

Solución

Lo que estás viendo es simplemente un artefacto de la lógica de fabricación incorporada del compilador. Cuando haces una compilación, le dice al compilador que construya todas las fuentes disponibles. Entonces, Delphi procesa cada archivo de origen y para cada unidad en las listas de usos para las cuales encuentra fuente, luego construirá ese archivo. Hace esto recursivamente. Cuando hace una compilación, solo se cargan los archivos .dcu existentes y, si se encuentran actualizados, no se hace nada. Esto en realidad puede conducir a un orden diferente en el que se descubren las unidades, ya que cada .dcu "aplanará" la lista de usos. Dado que las unidades se descubren y se cargan en un orden diferente, están a su vez, vinculadas en un orden diferente. Es por eso que sus archivos de mapa se ven tan diferentes. Dadas las mismas fuentes, el archivo del mapa debe ser el mismo si hace dos compilaciones seguidas o dos compilaciones seguidas.

Otras causas de las diferencias son más mundanas e incluyen cosas como la marca de tiempo del encabezado PE y otros bits de relleno y alineaciones.

Otros consejos

Creo que hay dos partes en esta respuesta.

Parte del problema que ves, IIRC, es que el compilador no cero la memoria antes de hacer una compilación/construcción. Por lo tanto, cualquier cosa que quede en la memoria no inicializada se convierte en la salida para fines de alineación.

También parece recordar que hay un sello de tiempo de fecha incluida en la información del encabezado PE para la solicitud. Eso causará una diferencia cada vez.

No soy la mejor persona para confirmar esto, pero esto es lo que parece recordar de las discusiones pasadas.

Personas como Allen Bauer o Barry Kelly probablemente podrían dar información mejor/más precisa sobre esto.

Si usa el compilador Defines en su proyecto y simplemente cambialas, si hace una compilación, no verá ningún cambio en las DCU y el módulo resultante (EXE o DLL). Si realiza una reconstrucción completa, el compilador define se usa en las DCU y módulos recién creados.

He visto esto en un gran grupo de proyectos donde usamos módulos en diferentes proyectos con diferentes define y todas las DCU se almacenan en el mismo directorio.

ERGO: El compilador no hace cumplir las dependientes de las define en este caso.

Quizás viste el mismo problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top