2008-08-29 15 views

Répondre

22

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.

+0

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. –

2

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?

+0

Cet appel croisé, quel type d'erreur donne-t-il? – Doug

3

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.

Questions connexes