Problèmes de lien (VC6)

J'ai ouvert un ancien espace de travail qui est une bibliothèque et son harnais de test. Auparavant, cela fonctionnait bien, mais ce n'est plus le cas et les anciennes versions du code ne fonctionnent pas non plus avec les mêmes erreurs. J'ai essayé de recréer le projet et cela provoque également les mêmes erreurs. Rien ne semble en panne dans les paramètres du projet et le code généré fonctionne dans l'application principale.

J'ai supprimé la plupart des fichiers et réduit au strict minimum pour générer l'erreur. Malheureusement, je ne peux pas publier le projet car il est utilisé dans le code de production.

L'erreur de l'éditeur de liens LNK2001 que j'obtiens signifie généralement que j'ai oublié une bibliothèque ou que j'ai oublié d'implémenter une fonction virtuelle. Cependant, cela fait partie de la bibliothèque de modèles standard - et constitue un en-tête.

Le code qui est répertorié comme ayant le problème dans IOCompletionPort.obj n'utilise pas directement std::string, mais appelle une classe qui fait : Comms::Exception accepte un < code>1 et la valeur de GetLastError ou WSAGetLastError.

La fonction mentionnée dans l'erreur (GetMessage) est implémentée, mais est une fonction virtuelle afin que d'autres classes puissent la remplacer si nécessaire. Cependant, il semble que le compilateur en ait fait une version Ansi, mais je ne trouve aucune option dans les paramètres qui contrôlerait cela. Je soupçonne que cela pourrait être le problème, mais comme il y a très peu d'options pour la bibliothèque, je n'ai aucun moyen de savoir avec certitude. Cependant, les deux projets doivent spécifier _MBCS dans les options du compilateur.

--------------------Configuration : TestComms - Débogage Win32-------------------- Liaison ... Comms.lib(IOCompletionPort.obj) : erreur LNK2001 : symbole externe non résolu ' public : classe virtuelle std :: chaîne_de_base, classe std::allocator > __thiscall Comms::Exception::GetMessageA(void)const ' (?GetMessageA@ Exception@Comms@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) Debug/TestComms.exe : erreur fatale LNK1120 : 1 externes non résolus Erreur lors de l'exécution de link.exe.

TestComms.exe - 2 erreur(s), 0 avertissement(s)

Des suggestions ? J'ai perdu la majeure partie de la matinée à cause de cela et je ne veux pas non plus perdre la majeure partie de l'après-midi.

请先 登录 后评论

4 réponses

Curt Hagenlocher

Une possibilité réside dans le « name-mangling » Win32 ANSI/Unicode, qui transforme le symbole GetMessage en GetMessageA ou GetMessageW. Il y a trois possibilités :

  1. Windows.h n'a pas été chargé, donc GetMessage reste GetMessage

  2. Windows.h a été chargé avec des symboles définis pour ANSI, donc GetMessage devient GetMessageA

  3. Windows.h a été chargé avec des symboles définis pour Unicode, donc GetMessage devient GetMessageW

Si vous avez compilé deux fichiers différents de manière à déclencher deux scénarios différents, vous obtiendrez une erreur de l'éditeur de liens. Le message d'erreur indique que la classe Comms::Exception était une instance de

请先 登录 后评论
graham.reeds

windows.h est déclaré en haut de IOCompletionPort.h en tant qu'inclusion - j'en avais marre de voir 7 lignes juste pour inclure 1 fichier, donc je l'ai enveloppé dans son propre fichier et l'inclut lui-même. Celui-ci contient également quelques éléments supplémentaires

请先 登录 后评论
Josh

En supposant que vous n'ayez pas hésité avec les paramètres du projet en supprimant quelque chose que vous ne devriez pas avoir (c'est là que je m'attendrais à ce que des dépendances externes telles que User32.lib soient) :

Vérifier les outils | Options | Annuaires | Bibliothèques (de mémoire ici) et assurez-vous que vous ne manquez pas les répertoires de bibliothèques de variétés communes à tous les jardins (encore une fois, sans VC6 devant moi, je ne peux pas vous dire ce qu'ils sont)

请先 登录 后评论
Michael Burr

Il s'agit d'un problème général lié à la manière dont Microsoft a géré les API ANSI et Unicode. Puisqu'ils sont tous (ou presque tous) réalisés en définissant des macros pour les noms de fonctions qui se résolvent en versions 'A' ou 'W' des noms de fonctions, vous ne pouvez pas en toute sécurité avoir un identifiant dans votre espace de noms/class/struct/enum/ fonction qui correspond à un nom d'API Windows.

Les macros windows.h s'exécutent grossièrement sur tous les autres espaces de noms.

请先 登录 后评论