Question

J'ai ouvert un ancien espace de travail qui est une bibliothèque et son harnais de test.Avant, cela fonctionnait bien, mais maintenant ce n'est plus le cas et les anciennes versions du code ne fonctionnent plus 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 anormal 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 je les ai réduits 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 je reçois signifie généralement que j'ai laissé de côté 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 en plus un en-tête.

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

La fonction mentionnée dans l'erreur (GetMessage) est implémenté, mais il s'agit d'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 permettrait de contrôler 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 d'en être sûr.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 ::basic_string,classe std ::allocateur > __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)

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

Était-ce utile?

La solution

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

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

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

  3. Windows.h était 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 le Comms::Exception class était une instance du numéro 2 ci-dessus - peut-être est-elle utilisée quelque part où windows.h n'a pas été chargé ?

Autres choses que je ferais à votre place, juste par routine :

1) Assurez-vous que mes chemins d'inclusion et de bibliothèque ne contiennent rien que je n'attends pas.

2) Effectuez un "build clean", puis vérifiez-le manuellement, en supprimant tous les fichiers objets supplémentaires si nécessaire.

3) Assurez-vous qu'il n'y a pas de chemins codés en dur dans les instructions include qui ne signifient pas ce qu'ils signifiaient lors de la reconstruction initiale du projet.

MODIFIER:Se battre avec le formatage :(

Autres conseils

@Sec:Je pense que c'est toi qui s'en est le plus rapproché.Je n'ai pas testé cela mais je pense avoir en quelque sorte donné la réponse à ma question initiale.

Obtenir un message est une définition dans Windows.h enveloppée dans un bloc ifndef pour basculer entre Ansi (GetMessageA) et Unicode (GetMessageW).

En supposant que vous n'ayez pas joué 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):

Outils de vérification | Les options | Répertoires | Libraries (en reprenant de mémoire ici) et assurez-vous que vous ne manquez pas les répertoires de bibliothèques de variétés communs à tous les jardins (encore une fois, sans VC6 devant moi, je ne peux pas vous dire ce qu’ils sont)

Il s'agit d'un problème général lié à la façon dont Microsoft a géré l'ANSI vs.API 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 avoir en toute sécurité un identifiant dans votre espace de noms/classe/struct/enum/. fonction qui correspond à un nom d’API Windows.

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

windows.h est déclaré en haut de IOCompletionPort.h comme 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.Cela contient également quelques #defines supplémentaires (c'est-à-dire ULONG_PTR) car notre application principale ne sera pas compilée avec le SDK Platform installé :-(

  1. Cela se confirme.Rien n'est déplacé.
  2. Je l'ai fait - j'ai supprimé les répertoires de construction
  3. Je n'utilise jamais de chemins codés en dur.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top