Question

Lors de la création de projets en C++, j'ai trouvé que le débogage des erreurs de liaison était délicat, en particulier lors de la récupération du code d'autres personnes.Quelles stratégies les gens utilisent-ils pour déboguer et corriger les erreurs de liaison ?

Était-ce utile?

La solution

Je ne sais pas quel est votre niveau d’expertise, mais voici les bases.

Vous trouverez ci-dessous une erreur de l'éditeur de liens de VS 2005 - oui, c'est un énorme gâchis si vous ne le connaissez pas.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

Il y a quelques points sur lesquels se concentrer :

  • "ByteComparator.obj" - Recherchez un fichier ByteComparator.cpp, c'est la source du problème de l'éditeur de liens
  • "int __cdecl Does_not_exist(void)" - C'est le symbole qu'il n'a pas pu trouver, dans ce cas une fonction nommée Does_not_exist()

À ce stade, dans de nombreux cas, le moyen le plus rapide de résoudre le problème consiste à rechercher cette fonction dans la base de code et à trouver où se trouve l’implémentation.Une fois que vous savez où la fonction est implémentée, il vous suffit de vous assurer que les deux endroits sont reliés entre eux.

Si vous utilisez VS2005, vous utiliserez le menu contextuel "Dépendances du projet...".Si vous utilisez gcc, vous rechercherez dans vos makefiles l'étape de génération de l'exécutable (gcc appelé avec un tas de fichiers .o) et ajouterez le fichier .o manquant.


Dans un deuxième scénario, il vous manque peut-être une dépendance "externe", pour laquelle vous n'avez pas de code.Les bibliothèques Win32 sont souvent implémentées dans des bibliothèques statiques auxquelles vous devez créer un lien.Dans ce cas, rendez-vous sur MSDN ou "Microsoft-Google" et recherchez l'API.Au bas de la description de l'API, le nom de la bibliothèque est indiqué.Ajoutez ceci à la liste "Propriétés de configuration-> Lien-> Entrée-> Dépendances supplémentaires" des propriétés de votre projet.Par exemple, la fonction timeGetTime()'s page sur MSDN vous indique d'utiliser Winmm.lib en bas de la page.

Autres conseils

Les bibliothèques d’exécution C sont souvent les plus grands coupables.Assurez-vous que tous vos projets ont les mêmes paramètres par rapport au monothreading et au multithreading et au statique vs dll.

La documentation MSDN est utile pour indiquer quelle bibliothèque nécessite un appel d'API Win32 particulier s'il apparaît manquant.

En dehors de cela, cela revient généralement à activer le drapeau détaillé et à parcourir la sortie à la recherche d'indices.

L'une des erreurs de liaison courantes que j'ai rencontrées survient lorsqu'une fonction est utilisée différemment de la façon dont elle est définie.Si vous voyez une telle erreur, vous devez vous assurer que chaque fonction que vous utilisez est correctement déclarée dans un fichier .h.
Vous devez également vous assurer que tous les fichiers sources pertinents sont compilés dans le même fichier lib.Une erreur que j'ai rencontrée est lorsque j'ai deux ensembles de fichiers compilés dans deux bibliothèques distinctes et que j'effectue des appels croisés entre les bibliothèques.

Avez-vous un échec en tête ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top