Функция не может соответствовать GLDEBUGPROC, только на MSVC (использует ту же версию glew 2.1.0, на linux с gcc / clang это нормально) - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть следующая определенная мной функция, которую я использую с glDebugCallback, которая прекрасно работает с GCC и Clang в Linux. Однако в Windows следующий код не хочет регистрироваться как обратный вызов отладки для OpenGL:

inline void messageCallback(GLenum source, GLenum type, GLuint id, 
                            GLenum severity, GLsizei length, const GLchar* message, 
                            const void* userParam) {
    // ...
}

и затем я настроил его с помощью

glDebugMessageCallback(messageCallback, nullptr);

Посмотрев, какие заголовки glew имеют, он показывает:

typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, 
                                       GLsizei length, const GLchar* message, 
                                       const void* userParam);

но я получаю сообщение об ошибке

Ошибка (активная) Аргумент E0167 типа "void (*) (источник GLenum, тип GLenum, идентификатор GLuint, серьезность GLenum, длина GLsizei, сообщение const GLchar *, const void * userParam)" несовместим с параметром типа " GLDEBUGPROC "

Я пытался выяснить, почему это не удается только с MSVC ... но я довольно застрял, поскольку похоже, что он соответствует дословно. Тот факт, что он компилируется в GCC / Clang, также немного сбивает с толку, я не уверен, что мне не хватает или почему это происходит.

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

Это в Visual Studio 2017 с использованием C ++ 17, glew 2.1.0, современного Opengl и т. Д. Моя версия OpenGL также составляет 4.6.

1 Ответ

1 голос
/ 19 апреля 2019

Возможно, вам нужно включить квалификатор GLAPIENTRY:

void GLAPIENTRY messageCallback(...)

Указывает соглашение о вызовах, которое указывает компилятору изменить способ передачи аргументов функции. На некоторых платформах это не имеет никакого значения, но я предполагаю, что это возможно на Windows.

...