Dans une application de VCL fraîche Testé sur deux versions de Delphi: étape pour reproduire: p>
Nous avons de petits fichiers .exe différents et des fichiers .MAP entièrement identiques. Ensuite, si nous répétons à nouveau toutes les étapes mais que vous utilisez dans le composant tiers du projet (j'essaye ODAC, DOA, DOA, DEVEXPRESSEZ et SELOFMADE) Nous obtenons des fichiers plus différents et différents .map. P>
pourquoi? Toute suggestion? P>
- Version 7.0 (Build 8.1)
- CodeGear ™ RAD Studio 2007 version 11.0.2902.10471 (Mise à jour de la + décembre 2007) P>
Quelques informations sur la façon dont j'ai trouvé cela et pourquoi ça m'intéresse:
Le projet est créé à partir d'un script simple avec Msbuild. Lorsque dans le projet a été ajouté traduction à Thru ite (DLL avec ressources), j'ai constaté que lorsque le projet était en construction (à partir d'un script ou de l'IDE) - Version traduite TRAVAILLE TRAVAILLE - Quelque texte sur le bouton, les étiquettes, etc. bouton, étiquettes). Lorsque le projet compilé de l'IDE - tout va bien. Donc, je commence à comparer Construire et compiler la sortie ... P>
3 Réponses :
Il y a deux parties à cette réponse que je crois. P>
Une partie du problème Votre voir, IIRC, est que le compilateur ne se présente pas de mémoire avant de faire une compilation / construction. Ainsi, tout ce qui reste dans la mémoire ininitialisée devient rempli dans la sortie à des fins d'alignement. p>
Je semble aussi rappeler qu'il existe un timbre de date inclus dans les informations d'en-tête PE pour l'application. Cela causera une différence à chaque fois. p>
Je ne suis pas la meilleure personne à confirmer cela, mais c'est ce que je semble rappeler des discussions passées. P>
Les gens comme Allen Bauer ou Barry Kelly seraient probablement en mesure de donner des informations meilleures / plus précises à ce sujet. P>
Pour Ryan: Vous avez raison à propos de la date d'horodatage - chaque construction sur le même projet génère un fichier exécutable différent (différence placée près de la fin du fichier) mais un fichier de carte identique. Mais la différence entre la construction et la compilée .exe est plus compliquée et existent la différence entre les fichiers .MAP (comme certaines fonctions placées à différentes adresses).
Ce que vous voyez est simplement un artefact de la logique intégrée du compilateur. Lorsque vous faites une construction, il indique au compilateur de construire toutes les sources disponibles. Donc, Delphi traite chaque fichier source et pour chaque unité des listes d'utilisations pour lesquelles il trouve source, elle construira ensuite ce fichier. Cela fait cela récursivement. Lorsque vous effectuez une compilation, seuls les fichiers existants .DCU sont chargés et s'ils sont jugés à jour, rien n'est fait. Cela peut réellement conduire à un ordre différent dans lequel les unités sont découvertes car chaque .DCU va efficacement "aplatir" la liste des utilisations. Étant donné que les unités sont découvertes et chargées dans un ordre différent, elles sont à son tour, liées dans un ordre différent. C'est pourquoi vos fichiers de carte ont l'air si différents. Compte tenu des mêmes sources, le fichier de carte doit être identique si vous faites deux constructions d'une rangée ou deux compiler dans une rangée. P>
D'autres causes de différences sont plus banales et incluent des éléments tels que l'horodatage de l'en-tête PE et d'autres morceaux de rembourrage et d'alignement. P>
@Allen: Merci pour les détails Allen, je ne connaissais pas la partie DCU, mais cela a du sens. Merci d'avoir expliqué cela. Serait-il possible alors d'autoriser le compilateur à utiliser un indice de compilateur Diriger le compilateur pour toujours relier les unités, DCU ou PAS Fichiers, toujours dans un certain ordre?
Cela vaincre tout le but, non? En outre, les liens d'application Delphi typiques vers des unités que vous n'êtes probablement absolument pas au courant. L'ordre de liaison est déterminé par la commande interne de la table des symboles du compilateur lui-même. Il est la clé de la façon dont le compilateur fonctionne. Pourquoi n'utilisez-vous pas simplement un processus de construction automatisé pour vos constructions «officielles» qui sont toujours construites à partir des sources brutes (c'est-à-dire qu'aucun DCU n'existe sur le système de construction)?
@Allen: J'utilise le processus de construction automatisé. Mais quand j'ai ajouté une traduction à mon projet (à l'aide de l'environnement de traduction intégré de Delphi - DLL avec des ressources) Il s'est cassé - lorsque la DLL utilisée avec des ressources traduites, l'interface utilisateur, vous ressemblez à certaines légendes de texte. Donc, quand je (ou script) faire - la traduction ne fonctionne pas. Quand je compile - Traduction fonctionne bien. Après une enquête, j'ai trouvé les différences entre la compilation et la construction. Je suis embarrassé...
Utilisez-vous l'option --DRC à partir du compilateur pour générer le fichier .DRC? Il s'agit d'un fichier généré par compilateur décrivant toutes les chaînes de ressources et leurs identifiants. Ce fichier peut être traité et exécuté par BRCC32 pour générer une chaîne de ressources traduite.
Non, je viens d'utiliser le projet-> Langues-> Ajouter ... (ou fichier-> Nouveau-> Autres ...-> Delphi Projects-> Assistant DLL de ressources) et IDE génère un nouveau projet (DLL avec des ressources - non seulement avec Resourctring mais avec des propriétés pablées de tous les objets de DFM) sur la base du projet principal.
@Allen: BTW, le fichier d'aide ne décrit pas la manière dont la ressource peut changer. Est-il normal d'utiliser l'ancienne DLL de ressources avec un projet mis à jour (+ 3 nouveaux ressources)? Si je n'ajoutez pas de ressourcement / Modifier DFM, mais je modifie des sources et faites de nombreuses constructions - les identifiants vont-ils changer?
@Alex, oui, il est possible que les ID de ressources puissent changer. Plus particulièrement, un changement d'ordre de liaison (en raison du comportement décrit ci-dessus) peut modifier l'allocation d'identité de chaîne. Le compilateur attribue toujours des identifiants de chaîne de ressources de la valeur la plus élevée. ATTENDU QUE, alliez-vous gérer manuellement les chaînes de ressources, on compterait généralement. Cela vous permet de gérer manuellement certaines chaînes et d'utiliser des chaînes de ressources. Cela minimise le risque d'une collision d'identité à chaîne.
Si vous utilisez Compiler définit votre projet et simplement modifié ceux-ci, si vous effectuez une compilation, vous ne verrez aucune modification sur le module DCU et le module résultant (EXE ou DLL). Si vous faites une reconstruction complète, les définitions du compilateur sont utilisées dans les DCU et les modules nouvellement créés. P>
J'ai vu cela dans un grand groupe de projet où nous utilisons des modules dans différents projets avec des définitions différentes et que tous les DCU sont stockés dans le même répertoire. p>
ergo: le compilateur n'applique pas les dépendances sur les définitions dans ce cas. P>
Vous avez peut-être vu le même problème. P>
Je pense que pas dans ce cas - mon problème se répète même dans une nouvelle demande de VCL fraîche.
Aucune idée, mais commencez vos tests avec des composants 3ème partie plus simples et que vous n'êtes qu'à plus compliqué. Assurez-vous également que les sources restent 100% de même. Les clauses d'utilisations différentes (y compris la commande!) Pourraient modifier la disposition des tables d'initalisation de l'unité et donc le binaire.
Les sources restent 100% la même - je ne fais que construire et compiler.
Vous constaterez également que construire i> et construire des fichiers binaires différents. Cela n'a rien à voir avec la différence entre la compilation et la construction.
@ROB: Que voulez-vous dire que construire i> et construire produit des fichiers binaires différents? Voulez-vous dire compiler et construire?
Non, Ryan. Max a dit que si vous construisez puis compilez, vous obtiendrez des résultats différents. Mais si vous construisez puis construisez à nouveau, vous obtiendrez toujours différents résultats. La différence entre la compilation et le bâtiment n'est pas pertinente dans ce cas.
@Rob: ah, ok. Je vois ce que tu voulais dire, merci d'avoir expliqué.
J'ai également remarqué que les fichiers binaires sont différents entre deux constructions sans changer quoi que ce soit du projet, j'ai fini par oublier depuis que l'exécution des binaires est la même.