2010-01-14 7 views
4

Je travaille sur la migration d'un ancien projet de Delphi 2007 à Delphi 2010. Une chose que j'ai trouvée est que l'exécutable résultant a plus que doublé de taille, et l'original était déjà assez grand. (Plus de 50 Mo.) Je soupçonne que cela a beaucoup à voir avec le RTTI étendu.

Depuis que le projet est antérieur à Delphi 2010, il n'utilise pas de RTTI étendu partout, et je voudrais être conservateur à propos de l'inclure. Est-il possible d'utiliser la boîte de dialogue Options du projet pour définir globalement {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} comme valeur par défaut? Je m'attendais à ce qu'il y ait une option pour cela (et pour $WEAKLINKRTTI) quelque part, mais je ne les vois pas.

Est-ce que quelqu'un sait si cela peut être fait à partir du champ "Options supplémentaires à transmettre au compilateur", ou d'une autre manière? Je préfère vraiment ne pas avoir à ajouter un fichier include à chaque unité du projet, car il y en a quelques milliers ...

Répondre

4

Vous pouvez essayer avec l'option de ligne de commande dcc32 –$weaklinkrtti. (comme {$WEAKLINKRTTI ON}).
Mais cela n'a pas l'impact de {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} dans chaque unité.
Votre meilleur pari serait de l'avoir en haut de chaque unité dans un fichier include.
Mais alors il ne le ferait pas pour le VCL/RTL qui serait encore gonflé ....

Mise à jour: Comparez aussi ce qui est comparable. Par exemple, vérifiez si vous n'incluez pas les informations de débogage dans les options du Linker dans le nouveau projet D2010 où vous ne l'avez pas dans le D2007 ...

+0

J'ai essayé de mettre '-weaklinkrtti' dans le champ" Options supplémentaires à transmettre au compilateur "dans Project Options, mais cela a juste donné un avertissement de compilateur: [DCC Warning] W1030 Directive de compilation invalide: '-weaklinkrtti'. –

+0

Désolé Mason, vous devez inclure le $ dans les options du projet. Ma faute. Réponse éditée –

0

Je ne connais pas une telle option, mais je continue utiliserait un fichier include.

Je ne serai pas un problème pour tout programmeur Delphi expérimenté pour écrire un petit programme pour ajouter un {$i ProjectIncludeFile.inc} à n'importe quelle unité dans vos dossiers (immédiatement après la ligne d'unité).

Et de cette façon, vous pouvez l'utiliser dans n'importe quel but que vous aimez.

Je me sers moi-même si f.i. pour définir une directive de compilation WriteTempFiles (que j'utilise f.i. pour enregistrer le contenu de la liste de chaînes à différents endroits lors du développement du programme), de cette façon je peux le désactiver à un endroit lorsque le programme est prêt pour le déploiement.

Comme la plupart de mes projets impliquent plusieurs exécutables et/ou DLL, c'est la façon la plus simple d'accomplir cette globalité pour l'ensemble du projet.

1

Etes-vous certain que cela est dû à la nouvelle info RTTI? Bien que ce soit beaucoup de données, cela ne devrait pas vraiment doubler la taille de votre application.

Vérifiez qu'il n'inclut pas les informations de débogage dans l'exécutable de version de version. En ce qui concerne la question, j'utilise {$ WEAKLINKRTTI ON} avant la clause uses dans le fichier dpr et il semble fonctionner correctement.

1

Dans un comment on Mason's own blog, en réponse à un commentaire à moi, Mason a répondu à cette question.

Essayez de mettre ces deux lignes en haut de votre RMR, avant la clause USES:

{$WEAKLINKRTTI ON} 
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} 

Cela fera en sorte qu'aucun RTTI obtient généré pour votre propre code ou tout troisième bibliothèques de parti que vous utilisez, sauf si ils sont dans une unité où la génération RTTI est explicitement activée. Vous ne peut pas l'éteindre pour le RTL ou VCL, mais cela ne devrait pas ajouter beaucoup à votre taille de toute façon.

4

Le comportement de la directive $ RTTI a été changé depuis XE6 parce qu'en fait, il était un bug parce qu'il était censé être local à l'unité actuelle (et il était en fait documented as that since Delphi 2010).

Il pourrait également avoir des effets fatals en utilisant la directive du tout, même dans une unité, car en raison du bogue, il a fondamentalement changé un drapeau global affectant les unités suivantes (comme dans l'ordre de compilation).