2008-11-07 7 views
7

Je suis assez nouveau dans le flux de construction C++, et je pense à passer à l'utilisation de liens partiels pour mes bibliothèques au lieu de créer des archives ar. J'espère réduire le temps de liaison dans une étape de compilation finale inévitable que j'ai, et je pense que la liaison partielle de certaines bibliothèques une fois pourrait me faire gagner du temps à tout relier dans cette dernière étape.g ++ lien partiel au lieu d'archives?

Est-ce que ce que je décris est possible? Je pense qu'il devrait être quelque chose le long des lignes ld -Ur -o mylib.o [components]. Y a-t-il des considérations de construction importantes que je ne prends pas en compte?

Répondre

6

Vous perdez un effet important d'avoir les fichiers objet dans une archive ar, qui est que seuls les objets référencés seront liés à.

Si vous avez à la fois foo.o avec le symbole foo et bar.o avec le symbole bar dans une archive ar, et seulement référence le symbole foo, seul foo.o serait lié. Si vous faites plutôt un lien partiel, le contenu des deux se retrouvera dans l'exécutable, même si bar n'est jamais référencé nulle part.

Vous pouvez également essayer un éditeur de liens plus rapide, comme gold.

+0

Donc, fondamentalement, le ballonnement exécutable peut être attendu comme un inconvénient de la liaison plus rapide, non? – cdleary

+0

Seulement si vous y avez des objets qui ne seraient pas autrement liés. Si votre bibliothèque fait partie de votre projet, il est tout à fait possible que vous l'utilisiez entièrement, et que vous n'ayez pas de problème supplémentaire. Le système de compilation du noyau Linux utilise ld -r beaucoup, mais ne lui transmet que les fichiers .o qu'il sait utiliser. – CesarB

+1

Il est possible d'utiliser '-ffunction-sections' et' -fdata-sections' avec '-Wl, - gc-sections' pour éliminer le code inutilisé au niveau de la fonction; voir http://gcc.gnu.org/ml/gcc-help/2003-08/msg00128.html – bdonlan

0

L'autre fois que vous souhaitez utiliser ld -r pour créer un lien partiel, vous avez besoin de certains fichiers objets contenant une initialisation statique, mais qui ne sont jamais directement appelés par le code.

Si vous souhaitez, je peux rédiger un document qui illustre comment cela fonctionne et pourquoi cela fonctionne! (Voir l'enregistrement de classe C++ à l'exécution par exemple, il utilise une fonction de registre statique qui s'enregistre dans un registre, qui peut ensuite être utilisé pour créer et renvoyer une Base * avec un comportement polymorphe puisqu'elle crée un nouvel objet qui était hérité de la base.Voir C++ runtime knowledge of classes qui est une réponse à une question que j'ai posée.)