2010-05-16 4 views
2

Je suis en train de lire comment mettre un fichier makefile ensemble, mais personne ne semble indiquer ce qu'il faut faire si vos fichiers requièrent différents ensembles de bibliothèques, ils semblent tous utiliser le même ensemble de bibliothèques pour chaque fichier. Comme il semble improbable que chaque fichier ait les mêmes bibliothèques, je suppose que la liste utilisée doit fusionner toutes les bibliothèques requises dans le projet. Je voulais juste savoir s'il y a un inconvénient à inclure trop de bibliothèques, ou si le compilateur détermine ceux qui sont nécessaires et ignore le reste?Surinclusion de bibliothèques C++

Merci

Répondre

2

S'il y a un inconvénient à inclure trop de bibliothèques?

Très peu.

Si le compilateur détermine ceux qui sont nécessaires et ignore le reste?

Presque exactement droite: c'est le éditeur de liens qui examine chaque bibliothèque et tire seul le code objet dont il a besoin.

Le seul inconvénient d'inclure un très grand nombre de bibliothèques est qu'il peut être difficile de les mettre dans le bon ordre. Les versions récentes de l'éditeur de liens GNU ont des options spéciales qui peuvent aider avec le problème des bibliothèques hors d'usage (et il est grand temps), mais ces options restent non-portables. D'un autre côté, si vous incluez des bibliothèques qui ne sont pas réellement nécessaires, l'ordre dans lequel elles apparaissent n'apparaîtra pas, car l'éditeur de liens examinera soigneusement chacune d'entre elles et décidera qu'aucun de ses contenus n'est nécessaire.

Pour tous ceux qui sont à la recherche de projets, voici un que j'aimerais: me donner un outil qui prend une liste de bibliothèques et fait un tri topologique sur les dépendances inter-bibliothèques, puis me dit un ordre Je peux les mettre sur la ligne de commande pour qu'il n'y ait pas de symboles librement définis.

+0

Merci, c'est utile. Une chose, cependant - je n'ai jamais rencontré quelque chose concernant l'ordre de la bibliothèque. Est-ce quelque chose dont je devrais être particulièrement préoccupé? Si oui, comment puis-je déterminer les inclusions correctes de la bibliothèque de commandes? – wyatt

+0

@wyatt, si l'ordre ne vous a pas mordu, il n'y a pas besoin de s'inquiéter à ce sujet. Sinon, la seule règle est que si liba dépend de libb, la ligne de commande doit avoir '-la -lb' et non' -lb -la'. –

1

L'éditeur de liens (l'outil qui prend tous les fichiers créés à partir .o la compilation de votre code source et les transforme en un fichier exécutable) ne sera pas un lien dans le code qui n'a pas été appelé dans l'exécutable. C'est à dire. a simplement déclaré:

void foo() 
{ 
// code 
} 

void bar() 
{ 
// code 
} 

int main() 
{ 
    foo(); 
    return 0; 
} 

Voici le code de foo sera lié dans l'exécutable, et le code de bar ne sera pas. En supposant que c'est tout le programme, bien sûr.

Pour une explication un peu plus complète, lisez le answer I've given just an hour ago à une autre question.

+0

Linker est assez intelligent pour ce genre de chose. – zdav