Вопрос по c, opengl, mingw, undefined-reference, windows – Неопределенные ссылки на функции _imp ____ glew * с помощью minGW gcc

2

Я пытаюсь скомпилировать относительно простую программу OpenGL, используя MinGW в системе Win 7 x64, и продолжаю получать неопределенные ссылки на некоторые из функций GLEW. Я установил библиотеки для связи с программами и искал любую библиотеку, которая может отсутствовать в моем списке, но выходные данные компоновщика все еще выглядят так:

16:35:50 **** Incremental Build of configuration Debug for project test ****
Info: Internal Builder is used for build
gcc -LD:/DEV/openGL/lib/x86 -LD:/DEV/x86/lib -o test.exe test.o -lfreeglut -lglaux -lglew32s -lglu32 -lglfw3 -lopengl32 -lgdi32 
test.o: In function `init':
E:\Development\C\test\Debug/../test.c:32: undefined reference to `_imp____glewGenVertexArrays'
E:\Development\C\test\Debug/../test.c:33: undefined reference to `_imp____glewBindVertexArray'
E:\Development\C\test\Debug/../test.c:35: undefined reference to `_imp____glewGenBuffers'
E:\Development\C\test\Debug/../test.c:36: undefined reference to `_imp____glewBindBuffer'
E:\Development\C\test\Debug/../test.c:37: undefined reference to `_imp____glewBufferData'
test.o: In function `display':
E:\Development\C\test\Debug/../test.c:45: undefined reference to  `_imp____glewBindVertexArray'
test.o: In function `main':
E:\Development\C\test\Debug/../test.c:61: undefined reference to `[email protected]'
collect2: ld returned 1 exit status

16:35:50 Build Finished (took 675ms)

Я попытался с обоими -lglew32 и -lglew32s в нескольких различных конфигурациях, думая, что, возможно, в glew32 были определения, которых не было в glew32, и это не помогло. Любое руководство о том, что я могу упустить, или что я упустил из виду?

Ваш Ответ

1   ответ
8

#define GLEW_STATIC до#include "glew.h" если вы используете статическую библиотеку ссылок. Я хотел бы добавить правило в ваш Makefile, чтобы определить этот токен препроцессора, вместо того, чтобы помещать#define ... в вашем исходном коде.

Это упоминается вмонтажная документация для GLEW, кстати. Но, судя по тому, сколько раз задавался этот вопрос, он может быть сформулирован недостаточно четко.

ОБНОВИТЬ:

Причиной определения этого токена является то, что Microsoft Windows использует специальный__declspec (...) для импорта и экспорта DLL. ОпределяяGLEW_STATIC, вы говорите компоновщику использовать стандартное поведение, чтобы найти символы в вашем.lib.

когдаGLEW_STATIC не определено, он сообщает компоновщику, что символы библиотеки разрешаются во время выполнения. Но MSVC нужно знать, создает ли он экспорт или ищет импорт, и поэтому есть еще один токенGLEW_BUILD это определяет это поведение. Поскольку вы хотите создать ссылку (импортировать), а не создавать (экспортировать) GLEW, убедитесь, что выне надо определятьGLEW_BUILD.

/*
 * GLEW_STATIC is defined for static library.
 * GLEW_BUILD  is defined for building the DLL library.
 */

#ifdef GLEW_STATIC
#  define GLEWAPI extern
#else
#  ifdef GLEW_BUILD
#    define GLEWAPI extern __declspec(dllexport)
#  else
#    define GLEWAPI extern __declspec(dllimport)
#  endif
#endif


Стоит также отметить, что вы не можете использовать встроенные динамические ссылки.lib и DLL файлы, которые поставляются на официальном сайте GLEW. Они скомпилированы с использованием MSVC; использовать DLL, скомпилированную с MSVC в MinGW, см.эта ссылка, Лучшее решение - просто избегать использования библиотеки динамических ссылок и использовать статическую библиотеку.

@CalebWaggoner Если вам от этого станет лучше, я не был тем человеком, который отрицательно оценил ваш вопрос. Вы четко продемонстрировали усилия по решению этой проблемы и объяснили шаги, которые вы предприняли, насколько я понимаю, в вашем вопросе нет ничего плохого. Я бы не написал ответ иначе. Что касается создания динамической библиотеки, пожалуйста, прочитайте документ по установке - я надеялся, что объяснениеGLEW_STATIC токен и указание вам на инструкции по установке будет достаточно, чтобы вы обнаружилиGLEW_BUILD токен в документации. Andon M. Coleman
Спасибо за заполнение более подробной информации по этому вопросу, так как это поможет следующему человеку, который придет и задаст этот же вопрос. После большого использования MSDN я стал немного подозревать в документации по API, но, похоже, мне придется над этим поработать. Кроме того, извините за обвинение вас в отрицательном голосовании Еще раз спасибо. Caleb Waggoner
Некоторое время меня обмануло то, что мне пришлось определять GLEW_STATIC при компиляции статической библиотеки glew.а также в проекте, который использует статическую библиотеку. Aberrant
У меня проблемы с ответом на этот вопрос. Во-первых, он охватывает только связь с glew32s, а не glew32, поэтому не полностью отвечает на вопрос. Во-вторых, вы проголосовали за этот вопрос из-за вашего раздражения, игнорируя любые усилия, которые я приложил в поисках решения, прежде чем спрашивать. В-третьих, вы игнорируете отсутствие понимания, которое возникает из-за простого незнания используемого модуля. Не всем нравится OpenGL, потому что «DirectX проще». Я не тот человек, но я надеюсь на понимание, а не на презрение, на то, что делаю ошибки, пытаясь учиться. Caleb Waggoner

Похожие вопросы