Если это все, что вы получаете за ошибку, это довольно хреновое сообщение. Это проблема с соглашениями о вызовах.
Из моего glu.h
:
GLAPI void GLAPIENTRY gluQuadricCallback (GLUquadric* quad, GLenum which, _GLUfuncptr CallBackFunc);
_GLUfuncptr
определяется как:
typedef void (GLAPIENTRYP _GLUfuncptr)();
с
#ifndef GLAPIENTRYP
#define GLAPIENTRYP GLAPIENTRY *
#endif
#ifndef GLAPIENTRY
#if defined(_MSC_VER) || defined(__MINGW32__)
#define GLAPIENTRY __stdcall
#else
#define GLAPIENTRY
#endif
#endif
Это объясняет разницу между Linux и Mingw.
Исходя из этого, вы можете подумать, что вам нужно объявить свой обратный вызов как
void GLAPIENTRY errorCallback();
и __stdcall
будут надеты на него, когда это уместно.
Однако, как отмечает Али в комментариях ниже, добавление GLAPIENTRY
к подписи обратного вызова не всегда работает. Кажется, что GLU 1.3 spec просто указывает, что void (*func)()
принимается. Поскольку некоторые реализации требуют взамен _GLUfuncptr
, который включает в себя требование GLAPIENTRY
, а другие вообще не определяют GLAPIENTRY
, здесь возникает проблема переносимости.
Возможный обходной путь может быть:
#ifndef GLAPIENTRY
#define GLAPIENTRY
#endif
и, тем не менее, объявляем все обратные вызовы с помощью макроса GLAPIENTRY
.