Почему я получаю неопределенную ссылку в этом коде?

Я использую Windows и вызываю функцию glGenBuffers. Когда я использую его, я получаю следующую ошибку:

error: undefined reference to _imp____glewBufferData

Я связываюсь с glew32 dll, которая находится в моей папке MinGW/lib, и у меня есть glew.h внутри MinGW/include. Я также поместил glew32.dll в папку WINDOWS/system32.

Я компилирую так:

mingw32-g++.exe ... -lglfw -lglfw3 -lopengl32 -lglew32 -lgdi32 -lglu32 -lglew32s

Это порядок библиотек, который вызывает проблему? Если да, то что должно предшествовать другому?


person template boy    schedule 21.05.2014    source источник
comment
Добавьте -DGLEW_STATIC в свою командную строку, так как вы подключаетесь к статической библиотеке. Ваше описание в вопросе неверно, DLL GLEW32 никоим образом не связана с вашей программой. Вы можете удалить его, чтобы сэкономить место на диске: P   -  person Andon M. Coleman    schedule 21.05.2014
comment
@AndonM.Coleman AndonM.Coleman Я думал, что это динамическая библиотека, так как я использую dll...   -  person template boy    schedule 21.05.2014
comment
Нет, связываясь с glew32s, вы связываетесь с статической библиотекой (это то, что означает s). На самом деле, используя mingw, вы даже не можете подключиться к динамической библиотеке, не прыгая через десятки обручей. Эта ошибка возникает из-за того, что вы скомпилировали хотя бы один из ваших исходных файлов без определения GLEW_STATIC, поэтому он использует неправильную компоновку.   -  person Andon M. Coleman    schedule 21.05.2014
comment
@ AndonM.Coleman Я также подключаюсь к динамической библиотеке (glew32.dll)   -  person template boy    schedule 21.05.2014
comment
@ AndonM.Coleman Хорошо, ты сказал правильно. Это сработало. Если вы сделаете ответ, я приму его.   -  person template boy    schedule 21.05.2014


Ответы (1)


MinGW не нравится бинарная динамическая библиотека, которая поставляется с glew для Windows, она будет работать только с Visual C++, если вы не сделаете с ней много ненужных сложных вещей.

Гораздо более простое решение — удалить -lglew32 из командной строки сборки, оставить -lglew32s (статическую библиотеку) и добавить -DGLEW_STATIC. Последняя часть очень важна, потому что glew по умолчанию предполагает динамическую компоновку, когда вы #include "glew.h". GLEW_STATIC должен быть определен первым, чтобы компоновщик правильно разрешал статические символы в Windows.

person Andon M. Coleman    schedule 21.05.2014
comment
Не могли бы вы помочь мне с другой проблемой? Я создал новый проект и получил неопределенную ссылку на использование glfwWindowHint. Поэтому я начал связываться с glfw3. Но затем я получил целую кучу множественных ошибок определения для кучи функций, которые я даже не использую. Это начинает происходить только тогда, когда я использую setWindowHint. Есть идеи? - person template boy; 22.05.2014
comment
@templateboy Вам придется задать другой вопрос или найти похожий, на который уже есть ответ. К сожалению, я никогда не использовал glfw. - person Andon M. Coleman; 22.05.2014