2010-08-09 3 views
0

В VS2005 я использовал соглашение о вызове _cdecl и проект строился без каких-либо ошибок компоновщика. После того, как я изменил соглашение о вызове на _stdcall при переносе проекта на VS2008, я получаю следующую ошибку:Изменение соглашения о вызове от cdecl до stdcall

ошибка LNK2001: неразрешенный внешний символ __imp__GCBOpen @ 8.

Настройки конфигурации> C \ C++> Genral> Поддержка Common Language Runtime установлена ​​значением Нет поддержки общей языковой среды

Мне нужна помощь в отношении каких-либо настроек проекта или изменений коды, которые необходимо сделать для того, чтобы решить эту проблему , Любая помощь приветствуется.

ответ

2

Похоже, GCBOpen() составлен __cdecl, но в его заявлении явно не указано. (Вот почему он связал ОК, когда ваш по умолчанию был __cdecl, но ломается, когда вы его меняете.) Вообще, для деклараций функций во внешних библиотеках рекомендуется указывать соглашение о вызовах, чтобы избежать проблем, таких как тот, который вы исправили.

Где-то вы должны иметь что-то вроде:

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

, который был бы лучше, как:

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

Thankyou за ответ. Это решило проблему. У меня все еще есть вопрос. Поскольку GCBOpen является импортированной функцией, объявление функции должно иметь ключевое слово «extern». Почему код компилировался без указания «extern», когда соглашение о вызове __cdecl? – Lakshmi

+0

'extern' предполагается для объявлений функций, которые не являются' static', поэтому вам не нужно явно указывать его. Я не знаю, почему я продолжаю писать это в своих собственных заявлениях ... –