Изменение соглашения о вызовах с cdecl на stdcall

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

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

Настройки конфигурации>C\C++>Общие>Поддержка общеязыковой среды выполнения установлена ​​на Нет поддержки общеязыковой среды выполнения.

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


person Lakshmi    schedule 09.08.2010    source источник


Ответы (1)


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

Где-то у вас должно быть что-то вроде:

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

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

#define CALLCONV __cdecl
__declspec(dllimport)
extern int CALLCONV GCBOpen(int, int);
person Brian Nixon    schedule 09.08.2010
comment
Спасибо за ответ. На самом деле это решило проблему. У меня еще есть вопрос. Поскольку GCBOpen является импортированной функцией, в объявлении функции должно быть ключевое слово extern. Почему код компилировался без указания extern, когда соглашение о вызовах — __cdecl? - person Lakshmi; 10.08.2010
comment
extern предполагается для объявлений функций, которые не являются static, поэтому вам не нужно указывать его явно. Не знаю, почему я упорно пишу об этом в своих декларациях... - person Brian Nixon; 10.08.2010