2010-08-09 37 views
0

Dans VS2005, j'utilisais la convention d'appel _cdecl et le projet se construisait sans aucune erreur de lien. Après avoir modifié la convention d'appel à _stdcall lors du portage du projet sur VS2008, j'obtiens l'erreur suivante:Modification de la convention d'appel de cdecl à stdcall

erreur LNK2001: symbole externe non résolu __imp__GCBOpen @ 8.

Paramètres de configuration> C \ C++> Genral> Common Language Runtime support est réglé sur Aucune prise en charge Common Language Runtime

je besoin d'aide en ce qui concerne les paramètres du projet ou des changements de code qui doivent être fait pour résoudre le problème . Toute aide est appréciée.

Répondre

2

Il semble que GCBOpen() soit compilé __cdecl mais sa déclaration ne l'indique pas explicitement. (C'est pourquoi il est lié lorsque votre valeur par défaut était __cdecl mais se casse lorsque vous le modifiez.) En général, il est recommandé que les déclarations de fonctions dans les bibliothèques externes spécifient la convention d'appel pour éviter des problèmes tels que celui que vous avez rencontré.

Quelque part vous devez avoir quelque chose comme:

__declspec(dllimport) 
extern int GCBOpen(int, int); 

qui serait mieux que:

#define CALLCONV __cdecl 
__declspec(dllimport) 
extern int CALLCONV GCBOpen(int, int); 
+0

Merci pour la réponse. Il a actaullay résolu le problème. J'ai encore une question. GCBOpen étant une fonction importée, la déclaration de la fonction doit avoir un mot-clé "extern". Pourquoi le code a-t-il compilé sans spécifier "extern" lorsque la convention d'appel est __cdecl? – Lakshmi

+0

'extern' est supposé pour les déclarations de fonction qui ne sont pas' static', vous n'avez donc pas besoin de le spécifier explicitement. Je ne sais pas pourquoi je persiste à l'écrire dans mes propres déclarations ... –