2017-07-19 1 views
0

J'ai hérité d'un projet hérité qui utilise certaines fonctions externes d'un fichier * .lib. D'après ce que l'on m'a dit, la syntaxe pour utiliser le fichier * .lib était correcte et ce pouvait être construit dans n'importe quelle version de studio visuel qu'ils utilisaient. (c'est-à-dire, il existe un fichier prototype externe "C", et toutes les signatures de fonctions sont correctes).C++ visual studio, symbole externe non résolu utilisant le fichier .lib

Lors de la construction, je reçois « LNK2019 d'erreur: symbole externe non résolu _A86_ReadConfigReg @ 12 référencé dans la fonction ... »

Je suis assez confiant que cela est lié au fichier * .lib depuis le * .lib le fichier a "A86" dans le nom ... Il y a aussi un * .dll avec le même nom.

Je suis allé aux propriétés du projet -> Lieur -> Entrée et listé le nom du fichier * .lib dans "Dépendances supplémentaires", mais pas de chance. J'ai essayé d'ajouter les répertoires d'inclusion, en copiant le * .lib & * .dll à l'emplacement exécutable. Mais pas de chance.

Comment corriger cette erreur?

Répondre

0

La première chose que vous devriez faire est d'inspecter la bibliothèque pour vous assurer que la fonction référencée est là. Démarrez une invite de commande développeur msvc et exécuter Dumpbin.exe

Syntaxe:

dumpbin /exports <full path library name> 

Cela vous donnera une liste de tous les symboles exportés de la bibliothèque.

Vous aurez une meilleure idée de ce qu'il faut faire à partir de là.

[EDIT]

dumpbin vous a dit que votre lib exporte une fonction appelée A86_ReadConfigReg, qui est une signature __cdecl et non une signature __stdcall comme [email protected] que votre linker attend .... Au moins deux choses que vous devrait faire/vérifier par ordre de priorité.

  1. Votre éditeur de liens recherche une signature d'appel pascal, ce qui est très étrange. Est-ce que votre projet a __stdcall par défaut pour les appels de fonction? Cela est contrôlé par le commutateur/Gz dans Project Properties->C/C++->Advanced->Calling Convention. La valeur par défaut doit être définie sur __cdecl (/ Gd)

  2. Vous devez vérifier que vos fichiers include contiennent toutes les déclarations de fonction dans un bloc extern "C" { }. Si ce n'est pas le cas, vous pouvez placer le bloc autour de la directive #include, vous n'avez donc pas besoin de modifier les fichiers de la bibliothèque.

comme ceci:

extern "C" { 
#include <mylib.h> 
} 
+0

Je l'ai fait faire, et la sortie du bac à décharge a une ligne indiquant: "15 A86_ReadConfigReg". Quelle est la prochaine étape? – user2913869

+0

@ user2913869 Vérifiez la réponse mise à jour pour votre problème d'éditeur de liens. –

+0

La convention d'appel était en effet définie sur __cdecl (/ Gd). Comme je l'ai mentionné dans la question d'origine, le fichier d'en-tête a en effet "extern" C "{} et tous les prototypes de fonction listés entre parenthèses.Je vois que le prototype est défini de la façon suivante: int _stdcall A86_ReadConfigReg (int iHandle, DWORD dwOffset, DWORD * pdwResult); J'ai donc aussi essayé de changer le libellé "_stdcall" en "__cdecl", puis je l'ai complètement supprimé, mais il ne serait toujours pas construit – user2913869