неразрешенный внешний символ __imp__glewInit VS __imp__glewInit @ 0

Когда я использую opengl в моей программе, я сталкиваюсь с проблемой при использовании «glew»: нерешенный внешний символ _чертенок_glewInit (при использовании glew 1.10.0), так как я заменяю glew32.lib на версию «глю 1.6.0«, эта проблема решена. Однако, когда я компилирую прикрепленный простой код в файле .cpp, шаг ссылки завершается ошибкой: внешний символ _чертенок_glewInit @ 0. Затем я использую dumpin.exe из VS2008 для проверки glew32.lib в glew 1.6.0 и glew 1.10.0, оказывается, что glew 1.6.0 имеет символ с именем _glewInit, а glew 1.10.0 имеет _glewInit @ 0.

Итак, мой вопрос: почему эти два glew32.libs имеют разные имена символов? Если я хочу использовать новые функции в glew 1.10.0 и имеет ошибку «неразрешенный внешний символ _чертенок_glewInit «, как лучше всего это решить?

 #include "glew.h"#include <GL/freeglut.h>
int main(int argc, char **argv){
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("123");
GLenum err = glewInit();
return 0;
}

PS: весь мой тест на Win7, компилятор VS2008_SP1.

2

Решение

@0 это схема оформления имени для __stdcall функция, которая передается 0 аргументы в байтах (другими словами, void функция). Используйте правильный заголовок, который поставляется с вашей библиотекой, чтобы он использовал соглашение о вызовах, с которым была скомпилирована библиотека. В этом случае, используете ли вы связь C или C ++ (как это предлагается в комментариях), не имеет значения, потому что __stdcall Соглашение о вызовах всегда добавляет подчеркивание в начале имени символа.

относительно _imp_glewInit это совсем другое дело, так как это заглушка импорта DLL. В конце концов, использование DLL-версии GLEW практически бесполезно. Поэтому я предлагаю вам использовать версию статической ссылки: glew32s.lib и определить GLEW_STATIC чтобы сделать вещи проще в долгосрочной перспективе.

Чтобы ответить на ваш последний вопрос: в GLEW нет новых функций, которые вы можете использовать, просто вставив новую версию DLL, ваша программа должна знать о расширениях, загружаемых GLEW, когда вы на самом деле пишете код. Если нет кода, который бы использовал одно из новых расширений, ничего не получилось. Вот почему версия DLL GLEW не предлагает ничего особенного по сравнению со статической библиотекой.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]