Question

Dans une nouvelle application VCL Compile et Construire opération produisent le même fichier binaire et la carte (avec des différences mineures à la fin du fichier .exe, même si « comprennent des informations de version dans le projet » option est désactivée - déjà discuté). fichier de la carte est le même octet à octet. Mais je wen ajouter un composant tiers le fichier binaire et la carte (!) Produit par Build et Compile sont significativement différentes!

testé sur deux versions de Delphi:
 - Version 7.0 (Build 8.1)
 - CodeGear ™ RAD Studio 2007 Version 11.0.2902.10471 (+ Décembre 2007 Mise à jour)

Étape pour reproduire:

  1. Créer une nouvelle VCL application. Peut-être ajouter un composant Delphi natif (j'essaie tous les composants de Standart, supplémentaires, onglet Win32 et système).
  2. Activer Fiche détaillée de la carte sur l'onglet Linker des options du projet.
  3. Créer projet .
  4. Renommer .exe de sortie et le fichier .map (par exemple: project1.exe à project1b.exe et project1.map à project1b.map).
  5. Compiler projet .
  6. Renommer .exe de sortie et le fichier .map (par exemple: project1.exe à project1c.exe et project1.map à project1c.map).
  7. Comparer les fichiers de l'étape 4 et 6. (j'utilise Winmerge 2.12.4.0).

Nous avons peu différents fichiers .exe et les fichiers .map complètement identiques. Ensuite, si l'on répète toutes les étapes à nouveau, mais utiliser dans le projet composant tiers (j'essaie ODAC, DOA, DevExpress et selfmade) nous obtenons plus différents fichiers .map .exe et différents.

Pourquoi? Toutes les suggestions?

UPDATE Quelques informations sur la façon dont j'ai trouvé cela et pourquoi il est me intéresse:
Projet est construit à partir du script simple avec MSBuild. Lorsque le projet a été ajouté la traduction à travers ITE (dll avec des ressources) J'ai trouvé que lorsque projet a été construit (à partir du script ou de IDE) - version traduite mal de travail - texte sur le bouton, les étiquettes etc. ont un mauvais endroit (littéralement d'une autre bouton, étiquettes). Lorsque projet Compilé à partir de l'IDE - tout est ok. Je commence et comparer Créer sortie ... Compile

Était-ce utile?

La solution

Qu'est-ce que vous voyez est tout simplement un artefact de la logique de marque intégrée du compilateur. Lorsque vous effectuez une construction, il indique au compilateur de construire toutes les sources disponibles. Donc, Delphi traite chaque fichier source et pour chaque unité dans les utilisations des listes pour lesquelles il trouve la source, il construira ensuite ce fichier. Elle le fait de manière récursive. Lorsque vous effectuez une compilation, seuls les fichiers existants .dcu sont chargés et si elles sont révélés être à jour, rien ne se fait. Cela peut effectivement conduire à un autre ordre dans lequel les unités sont découverts puisque chaque .dcu aura pour effet de « aplatir » la liste des utilisations. Étant donné que les unités sont découverts et chargés dans un ordre différent, ils sont en tour, liés dans un ordre différent. Voilà pourquoi vos fichiers cartographiques ont l'air si différents. Étant donné les mêmes sources, le fichier carte doit être le même si vous faites deux builds dans une ligne ou deux compiles dans une rangée.

Les autres causes des différences banales et comprennent plus des choses comme l'horodatage d'en-tête de PE et d'autres morceaux de rembourrage et les alignements.

Autres conseils

Il y a deux parties à cette réponse, je crois.

Une partie du problème de votre vision, IIRC, est que le compilateur ne zéro de la mémoire avant de faire une compilation / construction. Ainsi, plus rien dans la mémoire non initialisée devient charge dans la sortie à des fins d'alignement.

Il me semble aussi de rappeler qu'il ya un horodatage date inclus dans les informations d'en-tête de pe pour l'application. qui provoquera une différence à chaque fois.

Je ne suis pas la meilleure personne pour confirmer cela, mais c'est ce que je me souviens des discussions passées.

Des gens comme Allen Bauer ou Barry Kelly serait probablement en mesure de donner une meilleure / des informations plus précises à ce sujet.

Si vous utilisez le compilateur définit dans votre projet et vient de changer ceux-ci, si vous faites une compilation, vous ne verrez aucun changement aux années DCU et le module résultant (ou dll exe). Si vous effectuez une reconstruction complète du compilateur les définit sont utilisés dans les nouvellement créés et de modules DCU.

Je l'ai vu dans un grand groupe de projet où nous utilisons des modules dans différents projets avec différents et tous DCU définit ce sont stockés dans le même répertoire.

Ergo. Le compilateur n'applique pas les dépendances sur les définit dans ce cas

Peut-être avez-vous vu la même question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top