Forum Programmation.c++ Problème de taille des objets

Posté par .
Tags : aucun
1
25
août
2009
Bonjour,

J'ai une bibliothèque qui tourne sous linux, la taille de ces objets fait environs 105Mo, je dois porter cette bibliothèque sous windows, mais le problème que je rencontre est que la taille de ces objets fait 2,5Go du coup lors du linkage, j'ai une erreur de mémoire insuffisante.

Au moment de la compilation le compilateur de Visual a ralé car il lui faut l'option de compilation "-bigobj" pour augmenter la nombre de section des fichiers obj.

Ma question est la suivante, est ce que vous savez s'il est normal d'avoir une taille de fichiers obj aussi importante ? Et s'il est possible de réduire cette taille avec des options de compilation ?

Pour info voici les options de compilation que je passe au compilateur et au linkeur :

CXXFLAGS = -bigobj -nologo -Zm200 -Zc:wchar_t- -O2 -MD -EHsc -GR -W3 -w34100 -w34189 $(DEFINES)

LFLAGS = /LIBPATH:"e:\compilateur\Qt\4.5.2\lib" /NOLOGO /INCREMENTAL:NO /DLL /MANIFEST /MANIFESTFILE:"release\libIsograyData.intermediate.manifest" /IGNOREIDL

J'utilise Qt4 et son qmake.

Merci de vos réponses.
Cordialement.
  • # dur, dur

    Posté par . Évalué à 6.

    je te conseille plutôt de poster sur les forums msdn.

    Pour satisfaire ma curiosité, comment tu peux obtenir 105Mo de fichier objet sous linux ? Le projet est-il si gros que ca ?

    Je suppose que tu n'as pas le contrôle sur le code, alors tu peux vérifier si ton programme n'embarquerait pas également des ressources (images, ou autre) qui pourraient être chargés autrement et plus tard.


    • [^] # Re: dur, dur

      Posté par . Évalué à 1.

      Ok merci bien.

      Oui le projet est vraiment gros (environs 1350 fichiers sources).
      • [^] # Re: dur, dur

        Posté par . Évalué à 2.

        Oui le projet est vraiment gros (environs 1350 fichiers sources).
        Mouais, cela dépend réellement de comment c'est fait, par exemple :
        - fichiers générés automatiquement donnant de très petits fichiers
        - inclusions de librairies annexes afin d'être sûr que le projet compile toujours
        - des codes frankenstein : ca pousse dans tous les sens, on a peur d'enlever quoique ce soit, etc

        Je viens de jouer un peu avec les sources de chrome (i.e. j'ai retiré les images, les outils, bref une petit partie de ce qui ne fait pas chrome) et j'arrive à la taille de 63Mo de sources.
        Ton projet fait quelle taille ?
        • [^] # Re: dur, dur

          Posté par . Évalué à 1.

          La taille des sources + headers de mon projet fait : 27,5 Mo
          • [^] # Re: dur, dur

            Posté par . Évalué à 4.

            hé beh, presque la moité en taille du code source de chrome. Et ils confient la migration de l'applicatif à un débutant[1] et qui plus est migration de linux vers windows [2] ?

            Le binaire sous Linux il fait quelle taille à la fin[3] ? T'as vérifié qu'il n'y a pas de ressources embarquées [3] ? Pas possible de découper le projet (i.e. en plusieurs librairies) ?



            [1] :-P, une déduction peut-être erronée, qui s'appuie sur les faits suivants :
            - création d'un compte pour poser une question
            - question posée aux mauvais interlocuteurs (plutôt sur MSDN)
            [2] parce qu'il va en avoir un paquet de problèmes :-P
            [3] je frémis à l'idée de la taille d'un binaire sous Windows (en Giga, non !?!)
            [4] il fut un temps où Qt ne permettait "simplement" d'externaliser les ressources, maintenant cela a été changé : http://doc.trolltech.com/4.5/resources.html
          • [^] # Re: dur, dur

            Posté par . Évalué à 3.

            Pour obtenir un binaire qui fait plus de 3 fois la taille des sources, il doit se passer des choses pas très claires dans ton process de compilation (tout est linké en statique ? des templates instanciées à gogo pour palier les problèmes d'include ?). Franchement, ça ne m'inspire pas confiance pour la suite ...
            • [^] # Re: dur, dur

              Posté par (page perso) . Évalué à 2.

              Pour obtenir un binaire qui fait plus de 3 fois la taille des sources, il doit se passer des choses pas très claires
              Facile: il n'y a aucun commentaires, et les noms de fonctions et de variables n'ont que 3 lettres.
              Bon, même comme ça, je doute que ça fasse trois fois :-)
              • [^] # Re: dur, dur

                Posté par (page perso) . Évalué à 2.

                >> Facile: il n'y a aucun commentaires, et les noms de fonctions et de variables n'ont que 3 lettres.

                Si tu relisais K&R, tu saurais que c'est 3 variables d'une lettre…
        • [^] # Re: dur, dur

          Posté par . Évalué à 1.

          Donc en fait mon projet contient une dizaine de librairies dynamiques et celle-ci est la plus imposante. Je peux donc difficilement la découpée.
          Il n'y a pas de fichier généré, ce n'est que du fait main :)
          Frankenstein est passé à une époque, il a laissé du Fortran derrière lui mais ca c'est une autre lib, une autre histoire ....
          Il n'y a aucune ressource genre image ...

          Et j'ai décidé de poster chez vous vu l'incompétence des gens sur le forum msdn, vous êtes les meilleurs et les plus forts, voila le pourquoi du comment, je m'autoflagèle à venir parler windows ici.

          Par contre pour la piste des template à gogo, c'est peut etre mon cas, est-ce que vous pouvez développez un peu s'il vous plait.


          Merci beaucoup pour ces réponses.
          • [^] # Re: dur, dur

            Posté par (page perso) . Évalué à 4.

            Je ne suis pas un expert, mais il me semble que dès que tu utilises des templates, le compilo doit générer une version de la fonction par type existant dans le programme. Donc si tu as N types et M fonctions utilisant des templates, tu te retrouves avec N * M fonctions générées... En C tu utiliseras du (void *) et tu n'auras donc que M fonctions en tout, mais tu n'auras pas la vérification de type à la compilation...
            • [^] # Re: dur, dur

              Posté par . Évalué à 2.

              Exactement.

              Sous Windows, il y avait aussi le problème que chaque template, pour chaque type, doit être instanciée pour _chaque unité de compilation_ (chaque fichier, quoi). Ce qui commence à multiplier beaucoup les templates. Bon, normalement, le linker doit savoir éliminer les copies redondantes lors du link, mais peut-être que des fois il a du mal. À l'époque, je n'avais pas trouvé de solution simple pour régler ce problème, mais ça doit exister si on fait l'effort de se prendre un peu la tête (mais avec un projet aussi gros, j'ai peur que la complexité explose).
          • [^] # Re: dur, dur

            Posté par . Évalué à 1.

            Et j'ai décidé de poster chez vous vu l'incompétence des gens sur le forum msdn,
            c'est comme tous les forums, cela dépend :
            - des gens présents
            - que les gens soient stimulés par tes questions ( c.f. http://www.gnurou.org/writing/smartquestionsfr )

            vous êtes les meilleurs et les plus forts,
            la flatterie ne sert pas forcément mais ca touche toujours un peu :-) ( c.f. http://www.gnurou.org/writing/smartquestionsfr )

            Donc si je comprends bien, tu as une librairie qui lorsqu'elle est en générée, produit 105Mo de fichier objets sous linux ?
            Et la taille du code source pour cette librairie spécifiquement est de combien ? La librairie à la fin, elle fait quelle taille ?
            • [^] # Re: dur, dur

              Posté par . Évalué à 1.

              Merci pour toutes ces précisions apportées.

              Donc si je comprends bien, tu as une librairie qui lorsqu'elle est en générée, produit 105Mo de fichier objets sous linux ?
              Et la taille du code source pour cette librairie spécifiquement est de combien ? La librairie à la fin, elle fait quelle taille ?

              Oui c'est ça.
              27.5Mo et 35Mo.
              • [^] # Re: dur, dur

                Posté par . Évalué à 2.

                [ca va pas t'aider]
                ce me chiffone tout de même une librairie faisant 35 Mo (il faut ne pas oublier que dans une libraire les symboles externes -libc, etc- ne sont pas inclus).

                Quelques points de comparaison (librairies en 'release') :
                - noyau linux + modules = 56 Mo (il s'agit là du noyau de la debian, noyau généraliste),
                - Qt complet (même avec Webkit) en = 43 Mo (Qt sans la lib webkit = 28Mo),

                En fait, j'ai rien trouvé sur mon système qui fasse une taille pareil. Tu confonderais pas avec la version avec symboles pour le débuggage ?
                [/ca va pas t'aider]

                Pour t'aider, si jamais il n'y a pas de problèmes avec ta librairie et que tu peux pas t'en sortir avec les flags qui vont bien, alors il ne te reste plus qu'à la découper en plusieurs sous-librairies différentes (évidemment, il te faut de l'aide pour faire un découpage sémantique de cette librairie, de l'aide du responsable projet, etc). Fais-le d'abord sous linux (pour bien tout valider), puis pour passe à windows (tu peux jeter un œil là dessus : http://www.boost.org/development/separate_compilation.html).

                Bon courage.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.