OpenGL с Eclipse CDT + MinGW + GLEW + GLFW: неопределенные ссылки

Изменить: я тем временем разобрался в этом и написал подробный ответ ниже.

Я просто попытался переключиться с экспресс-версии MSVC 10 на Eclipse CDT в Win7, и во время настройки я столкнулся с проблемой со следующим простым кодом OpenGL (который отлично работает в Visual Studio):

#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main()
{
    GLFWwindow* w;

    if (!glfwInit())
        return -1;

    w = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!w)
    {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(w);

    glewExperimental = true;
    if (glewInit() != GLEW_OK)
    {
        return -1;
    }

    while (!glfwWindowShouldClose(w))
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glfwSwapBuffers(w);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

В Visual Studio я включаю пути к библиотекам для GLFW и GLEW и связываю (в дополнение к тому, что VS делает встроенный) opengl32.lib, glew32s.lib, glfw3.lib в этом порядке.

Теперь, если я сделаю то же самое в Eclipse CDT, я не смогу заставить его работать. Возникают следующие ошибки:

Info: Internal Builder is used for build
g++ "-LD:\\lib\\cpp\\glfw-3.0.1.bin.WIN32\\lib-mingw" "-LD:\\lib\\cpp\\glew-1.10.0binaries\\lib\\Release\\Win32" -o glfwcheck.exe main.o -lopengl32 -lglew32s -lglfw3 
Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unrecognized
D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_2]+0x4): undefined reference to `_imp__wglGetProcAddress@4'
D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_3]+0x4): undefined reference to `_imp__wglGetProcAddress@4'
d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj): bad reloc address 0x4 in section `.text[__glewInit_GL_VERSION_1_3]'
d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

Конечно, я пытался изменить порядок трех библиотек, но это только злило. (Кстати: мне кажется странным, что я не могу воспроизвести эти ошибки выше, так что они единственные, когда я переставляю библиотеки в исходный порядок. Я остаюсь на 20+ ошибках, пока не удалю ВСЕ библиотеки , постройте и добавьте их снова.)

Покопавшись и просмотрев сообщения на форуме, я подумал, что, возможно, это проблема с двоичными файлами GLEW, и скомпилировал их самостоятельно с помощью MinGW. Только на этот раз я получаю все ошибки типа «не найдено». Я не знаю, как я могу статически связать с моим самокомпилированным GLEW, поскольку теперь glew32s.lib больше нет, а есть только libglew32.a и libglew32mx.a. Динамическое связывание с glew32 и помещение dll в папку моего проекта тоже не сработало.

Мне кажется, что я делаю что-то очень неправильное здесь, в Eclipse, или просто забываю некоторые дополнительные библиотеки (хотя однажды я попытался поместить туда все те, которые использует VS, и он по-прежнему делал то же самое).

Можете ли вы мне помочь? :) В противном случае, думаю, мне пришлось бы остаться с VS или перейти на Linux + make.


person InvisiblePanda    schedule 30.12.2013    source источник
comment
Это не решит проблему, но решит проблему в будущем. Вам нужно позвонить glewInit() после того, как позвоните glfwMakeContextCurrent(w);   -  person vallentin    schedule 30.12.2013
comment
@Vallentin Спасибо, и вы правы, думаю, я даже однажды столкнулся с этим при переходе на GLFW3: D   -  person InvisiblePanda    schedule 30.12.2013
comment
@InvisiblePanda - вы отлично работаете с предлагаемыми правками по вопросам, настолько, что я подумал, что должен как-то сообщить вам (хотя это не то место!). Продолжайте хорошую работу!   -  person ʍǝɥʇɐɯ    schedule 07.05.2014


Ответы (1)


Я понял это, и для всех, кто когда-либо сталкивался с этой проблемой, я постараюсь пояснить, что именно я сделал, чтобы, наконец, иметь возможность создавать проекты OpenGL с настройкой MinGW + GLEW + GLFW. В моем случае я использовал Eclipse CDT в качестве IDE, но я запишу получившуюся g++ командную строку, чтобы ее было легко адаптировать к другим IDE.

  1. Я предполагаю, что MinGW и MSYS (можно выбрать для установки из графического интерфейса MinGW; поэтому загружать отдельно не нужно).

  2. Загрузите GLFW и распакуйте его в выбранную папку внешних библиотек (в моем случае это D:\external\cpp, поэтому быть чем-то вроде D:\external\cpp\glfw, где я переименовал папку glfw-3.0.3.bin.WIN32 в просто glfw).

  3. Загрузите GLEW исходный код в виде zip-папки и распакуйте его в моем если это в D:\external\cpp\glew. Теперь запустите MSYS, cd в папку glew и вызовите make all.

  4. Шаг 3 должен был создать (среди прочего) файлы libglew32.a и glew32.dll внутри папки glew\lib. Теперь щелкните правой кнопкой мыши проект Eclipse CDT C ++ и выберите Свойства - Общие для C / C ++ - Пути и символы. На вкладке Включает добавьте пути к include папкам GLFW и GLEW. Опять же, для меня это D:\external\cpp\glew\include и аналог GLFW. В Пути к библиотекам сделайте то же самое для папок lib (GLEW) и lib-mingw (GLFW).

  5. Теперь нам нужно добавить библиотеки, с которыми мы хотим связать наш проект. Если вы хотите установить динамическую связь с GLEW, обязательно включите glew32.dll в папку, в которой будет находиться ваш исполняемый файл. В Eclipse CDT это обычно папка Debug (или Release) в структуре вашего проекта. На вкладке Библиотеки в окне параметров, которое мы открыли ранее, добавьте (порядок важен!) glfw3, glew32, opengl32, glu32, gdi32. Надеюсь, теперь создание проекта должно сработать. Если вы хотите связать статически с GLEW, добавьте те же библиотеки, за исключением glew32. Вместо этого в свойствах проекта перейдите в C / C ++ Build - Settings и на вкладке Tool Settings - MinGW C ++ Linker - Miscellaneous добавьте путь к libglew32.a в Поле "Другие объекты". В моем случае это D:\external\cpp\glew\lib\libglew32.a. Теперь, чтобы статическое связывание работало, вы должны либо добавить #define GLEW_STATIC выше #include <GL/glew.h>, либо использовать команду препроцессора -DGLEW_STATIC. На домашней странице GLEW говорится, что также можно включить файлы glew.c и glew.h в ваш проект для статической связи, но почему-то у меня это не сработало.

Эти шаги сработали для меня, и они создали командные строки, подобные приведенным ниже (у меня есть только один файл с именем main.cpp, и я использовал статическое связывание с GLEW), что может быть полезно, если вы пытаетесь разобраться в этом вопросе без Eclipse CDT.

g++ -ID:\external\cpp\glew\include -ID:\external\cpp\glfw\include -c -o main.o main.cpp
g++ -LD:\external\cpp\glew\lib -LD:\external\cpp\glfw\lib-mingw -o minimalexample.exe main.o D:\external\cpp\glew\lib\libglew32.a -lglfw3 -lopengl32 -lglu32 -lgdi32

В случае динамического связывания просто удалите часть, содержащую libglew32.a во второй строке, и добавьте -lglew32 между -lglfw3 и -lopengl32. В качестве небольшого примера исходного файла вы можете просто использовать код из моего вопроса выше.

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

Обновление: я попытался повторить это еще раз несколько дней назад и столкнулся с проблемами с предварительно скомпилированными двоичными файлами GLFW для Windows (сейчас я использую Win8.1). Но вы можете просто использовать CMake в сочетании с mingw32-make, чтобы скомпилировать его самостоятельно. Кроме того, похоже, что GLEW больше не получает обновлений, поэтому вместо этого я переключился на рад. Также можно использовать MinGW-w64 для компиляции библиотек и вашего окончательного проекта как 64-разрядного. битовое приложение.

person InvisiblePanda    schedule 30.12.2013
comment
На шаге 3 я застрял в том, как перейти к папке glew в msys. Мне помогли ответы на этот вопрос: stackoverflow.com/questions/11376899/ просмотр-папки-в-msys - person Paul Wintz; 24.02.2017