4 votes

Pourquoi mes fichiers .obj de Visual Studio sont-ils massifs en taille par rapport au fichier .exe de sortie ?

En arrière-plan, je suis développeur d'un projet opensource, une bibliothèque c++ appelée openframeworks, qui est un wrapper pour différentes bibliothèques, comme opengl, quicktime, freeImage, etc. Dans la prochaine version, nous avons ajouté une bibliothèque c++ appelée POCO, qui est similaire à boost à certains égards car c'est une alternative pour la fonctionnalité de la bibliothèque de base java.

Je viens de remarquer, que dans cette dernière version où j'ai ajouté la bibliothèque POCO en tant que bibliothèque liée statiquement, les fichiers .obj produits lors de la compilation sont vraiment massifs - par exemple, plusieurs fichiers .obj pour des fichiers .cpp vraiment petits font 2mb chacun. Les fichiers .obj compilés au total font environ 12mb environ. En revanche, les exécutables produits sont petits - de 300k à 1mb.

En comparaison, la même bibliothèque compilée dans code::blocks produit des fichiers .obj d'une taille à peu près similaire à celle de l'exécutable - ils sont tous assez petits.

Est-ce qu'il se passe quelque chose lors de la liaison, et du processus .obj dans visual studio que je ne comprends pas ? Par exemple, est-ce qu'il effectue une sorte de pré-liage intelligent, ou autre chose, qui ajoute à la taille des .obj ? J'ai expérimenté un peu avec les paramètres, comme la liaison incrémentielle, etc, et je n'ai pas vu de changements.

Merci d'avance pour toute idée à essayer ou informations !

-zach


note: merci beaucoup ! Je viens juste d'essayer, dumpbin, qui dit "objet anonyme" et ne renvoie pas d'informations sur l'objet. Ceci pourrait en être la raison....


note 2, après avoir vérifié le lien ci-dessus, en retirant LTCG (génération de code au moment de la liaison - /GL), les fichiers .obj sont beaucoup plus petits et dumpbin les comprend. Merci encore !!

1voto

coppro Points 10692

Je ne suis pas du tout expert de Visual Studio, n'ayant pratiquement jamais utilisé, mais je crois que Visual Studio utilise des optimisations au moment du lien, ce qui peut rendre le code résultant plus rapide, mais peut coûter beaucoup d'espace dans les bibliothèques. De plus, il se peut (je ne connais pas les détails internes) que les informations de débogage ne soient pas supprimées jusqu'à la phase de liaison proprement dite.

Je suis sûr que quelqu'un va venir avec une réponse meilleure/plus détaillée de toute façon.

1voto

Die in Sente Points 5387

Peut-être que la différence est l'information de débogage.

Le compilateur écrit les informations de débogage dans le fichier .obj, mais le lien ne place pas ces données dans le fichier .exe ou .dll. Elles sont soit supprimées, soit placées dans un fichier .pdb.

En tout cas, utilisez l'utilitaire DUMPBIN de Visual Studio sur les fichiers .obj pour voir ce qu'ils contiennent.

1voto

MSalters Points 74024

Les fichiers objets doivent contenir suffisamment d'informations pour le lien. En C++, c'est basé sur le nom. Deux fichiers objets font référence au même objet (donnée/fonction/classe) s'ils utilisent le même nom. Cela implique que tous les fichiers objets doivent contenir des noms pour tous les objets qui pourraient être référencés par d'autres fichiers objets. Cependant, l'exécutable aura besoin des noms visibles depuis l'extérieur de la bibliothèque. Dans le cas d'une DLL, cela signifie seulement les noms exportés. L'économie est double : il y a moins de noms et ces noms ne sont présents qu'une seule fois dans la DLL.

Les bibliothèques C++ moderne utiliseront des espaces de noms. Ces espaces de noms signifient que les noms d'objets deviennent plus longs, car ils incluent les noms des espaces de noms d'encapsulation également.

0voto

e.James Points 51680

Les fichiers obj de la bibliothèque compilée seront énormes car ils doivent contenir toutes les fonctions, classes et modèles que vos utilisateurs finaux pourraient éventuellement utiliser.

Les exécutables qui font référence à votre bibliothèque seront plus petits car ils incluront uniquement le code compilé dont ils ont besoin pour s'exécuter. Il s'agira généralement d'un petit sous-ensemble de la bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X