Lors de la création de projets en C++, j'ai trouvé que le débogage des erreurs de liaison était difficile, en particulier lorsque je prenais le code d'autres personnes. Quelles stratégies les gens utilisent-ils pour déboguer et corriger les erreurs de liaison?Meilleures pratiques pour le débogage des erreurs de liaison
Répondre
Vous ne savez pas quel est votre niveau d'expertise, mais voici les bases. Ci-dessous est une erreur de liaison de VS 2005 - oui, c'est un gâchis géant si vous n'êtes pas familier avec elle.
ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" ([email protected]@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" ([email protected]@[email protected]@[email protected])
Il y a quelques points à se concentrer sur:
- "ByteComparator.obj" - Recherchez un fichier ByteComparator.cpp, c'est la source du problème de liaison
- « int __cdecl does_not_exist (void) » - Ceci 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 la résolution est à la recherche t Il base le code pour cette fonction et trouve où l'implémentation est. Une fois que vous savez où la fonction est implémentée, vous devez simplement vous assurer que les deux endroits sont reliés entre eux. Si vous utilisez VS2005, utilisez le menu contextuel "Dépendances du projet ...". Si vous utilisez gcc, vous rechercheriez dans vos makefiles l'étape de génération de l'exécutable (gcc appelé avec un tas de fichiers .o) et ajouteriez le fichier .o manquant. Dans un deuxième scénario, il peut vous manquer 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 que vous devez lier. Dans ce cas, passez à 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 aux propriétés de votre projet "Liste de propriétés de configuration-> Linker-> Input-> Additional Dependencies". Par exemple, la fonction timeGetTime() de page on MSDN vous demande d'utiliser Winmm.lib en bas de la page.
L'une des erreurs de liaison courantes que j'ai rencontrées est 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 toutes les fonctions que vous utilisez sont correctement déclarées 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 quand j'ai deux ensembles de fichiers compilés dans deux bibliothèques séparées, et je croise entre les bibliothèques.
Y a-t-il une défaillance que vous avez en tête?
Cet appel croisé, quel type d'erreur donne-t-il? – Doug
Les bibliothèques C-runtime sont souvent les plus coupables. Assurez-vous que tous vos projets ont les mêmes paramètres par rapport à single vs multi-threading et statique vs dll.
La documentation MSDN est utile pour indiquer quelle librairie nécessite un appel API Win32 particulier s'il apparaît comme manquant. À part cela, il revient généralement à activer le drapeau verbeux et à parcourir la sortie à la recherche d'indices.
- 1. Recommandations de gestion des erreurs AJAX et meilleures pratiques
- 2. Meilleures pratiques pour le traitement des erreurs de la base de données dans CodeIgniter
- 3. Meilleures pratiques pour l'écriture de widgets javascript
- 4. Meilleures pratiques pour implémenter des modèles dans le modèle MVC
- 5. Conseils pour le débogage des erreurs de latex dans Doxygen
- 6. Meilleures pratiques pour Entity Framework?
- 7. Meilleures pratiques pour la gestion des erreurs dans un service Web
- 8. Meilleures pratiques: Suivi des impressions de bannières
- 9. Meilleures pratiques pour les chaînes de connexion
- 10. Stockage des clés de chiffrement - meilleures pratiques?
- 11. ThreadPool Meilleures pratiques, Correct
- 12. NAnt meilleures pratiques
- 13. Quelles sont les meilleures pratiques pour le suivi des avertissements/erreurs dans les processus de longue durée?
- 14. Meilleures pratiques Maven
- 15. meilleures pratiques pour le développement de niveau dans Visual Studio
- 16. Meilleures pratiques de gestion des exceptions de base de données
- 17. Pattern Repository meilleures pratiques
- 18. Dénomination DataContext Meilleures pratiques
- 19. Meilleures pratiques ASP.NET MVC
- 20. Meilleures pratiques de classe C++
- 21. Meilleures pratiques pour les références JavaScript IntelliSense
- 22. Meilleures pratiques LDAP
- 23. Quelles sont certaines des meilleures pratiques Sharepoint?
- 24. meilleures pratiques d'organigramme
- 25. Meilleures pratiques pour les comptes non enregistrables
- 26. Meilleures pratiques NHibernate Transactions
- 27. Meilleures pratiques pour l'internationalisation d'une application Flex?
- 28. Meilleures pratiques pour stocker les paramètres de l'interface utilisateur
- 29. Meilleures pratiques de Webrequest asynchrones
- 30. Meilleures pratiques pour la collection XML
Eh bien, et si je trouve l'endroit où la méthode est implémentée et que je n'y vois rien de mal, que dois-je faire ensuite? Est-il possible d'obtenir une liste de fichiers liés?Votre réponse est certainement bonne pour les débutants, mais c'est le résultat du top 1 pour le débogage du linker et il y a d'autres causes possibles que typo dans le nom de la fonction. –