Компиляция минимального GLEW-приложения под Cygwin

Рассмотрим следующую программу и попробуем скомпилировать ее под Cygwin:

#include <GL/glut.h>
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glLoadIdentity();
}

Он компилируется и работает нормально. -I/usr/include/opengl кажется ужасно важным.

g++ -I/usr/include/opengl -I../include/cygwin -L../lib/cygwin test.cpp -o test.exe -lglut32 -lglu32 -lglew32 -lopengl32

В настоящее время,

#include <GL/glew.h> // from newest NVIDIA SDK
#include <GL/glut.h>
int main(int argc, char** argv)
{
    glewInit();
    glutInit(&argc, argv);
    glLoadIdentity();
}

составленный

g++ -I/usr/include/opengl -I../include/cygwin -L../lib/cygwin test.cpp -o test.exe -lglut32 -lglu32 -lglew32 -lopengl32

терпит неудачу. Как собрать второе приложение?

Первый

Есть несколько способов собрать glew by из NVIDIA SDK: VS, cygwin, cygwin с -D_WIN32. Я также попробовал cygwin build из оригинального glew из исходников.

VS build дает

/cygdrive/c/DOCUME~1/kelebron/LOCALS~1/Temp/ccErbecl.o:test.cpp:(.text+0xa8): undefined reference to `_glLoadIdentity'
collect2: ld returned 1 exit status

сборки cygwin дают много

../lib/cygwin/glew32.lib(glew.o):glew.c:(.text+0x38e): undefined reference to `_glXGetProcAddress'

и cygwin с -D_WIN32 вообще не компилируется (меня слегка мотивировал этот пост).

Второй

Кажется, есть два способа связать с OpenGL
с -L / lib / w32api
или с -L / usr / X11R6 / lib -lX11 -lXi -lXmu

Но директивы -L ничего не меняют. У меня есть /usr/lib/w32api/libopengl32.a, но может отсутствовать версия X11 (/ usr / X11R6 / lib / libGL?). Какой пакет я должен включить в Cygwin? Все установил начиная с libGL (не только ...).


person kelebron    schedule 23.12.2008    source источник


Ответы (4)


Некоторое время назад у меня была похожая проблема, и я обнаружил, что есть два способа скомпилировать код opengl под Cygwin.
Первые ссылки на собственные библиотеки win32api glut32 glu32 opengl32 (также glui). Они несколько старше:
glut v3.7.6
opengl v1.1
glui 2.11

Второй способ использует избыток библиотек X11 glu gl. У них есть новый номер версии в своих файлах заголовков (обратите внимание, что для использования расширений GL требуется> v1.2):
glut v4 (freeglut)
opengl v1.3
glext
...

Итак, чтобы использовать первый вариант, скомпилируйте с: -I / usr / include / opengl
и ссылку на: -lglut32 -lGLU32 -lOpenGL32

Чтобы использовать версию X11, скомпилируйте с: -I / usr / include / (который включен по умолчанию)
и свяжите с: -lglut -lGLU -lGL (обратите внимание на разницу)
вы можете добавить заголовки и библиотеки X11, но я думаю, что они включены в GL.
-I / usr / X11R6 / include
-L / usr / X11R6 / lib -lXmu -lXi -lXext -lX11


В установщике Cygwin вы можете выбрать следующие пакеты:
opengl - дает win32-версию opengl, glut, glui
libglut-devel - X11-версию glut (freeglut), это также выберет все зависимые пакеты. (glproto, libGL libGLU, libX11, ...)
Я также рекомендую включить Xorg-сервер, так как вам понадобится X-сервер.

Надеюсь, это поможет.

person Amro    schedule 08.06.2009

Чтобы убедиться, что мы говорим об одних и тех же проблемах, вот сообщение, которое я раньше получал.

$ g ++ -o glew_test.exe glew_test.cpp -lglut32 -lglew32
c: \ Users \ Fredrik \ Users \ Fredrik \ AppAppData \ Local \ Temp / ccgSNdfr.o:
glew_test.cpp :(. text + 0x1c ): неопределенная ссылка на `__glutInitWithExit '
c: \ Users \ Fredrik \ AppData \ Local \ Temp / ccgSNdfr.o:
glew_test.cpp :(. text + 0x37): неопределенная ссылка на` __glutCreateWindowWithExit'
c: \ Users \ Fredrik \ AppData \ Local \ Temp / ccgSNdfr.o:
glew_test.cpp :(. text + 0x53): undefined ссылка на `__glutCreateMenuWithExit '
c: \ Users \ Fredrik \ AppData \ Local \ Temp / ccgSNdfr.o:
glew_test.cpp :(. Text + 0x9e): undefined ссылка на `glutInitDisplayMode '
c: \ Users \ Fredrik \ AppData \ Local \ Temp / ccgSNdfr.o:
glew_test.cpp :(. text + 0xb2): undefined ссылка на `glutInitWindowPosition '
c: \ Users \ Fredrik \ AppData \ Local \ Temp / ccgSNdfr.o:
glew_test.cpp :(. text + 0xc6 ): неопределенная ссылка на `glutInitWindowSize '
collect2: ld вернул 1 статус выхода

The following pages helped me with this issue.

В основном мне приходилось определять _STDCALL_SUPPORTED и _M_IX86 в начале файла и включать windows.h перед glew.h

Затем я использовал флаги -lglut32 -lglew32

Если вы хотите попробовать, вот источник:

#define _STDCALL_SUPPORTED
#define _M_IX86
#include <windows.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include <cstdio>

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutCreateWindow("MM 2004-05");
    glewInit();
    if (glewIsSupported("GL_VERSION_2_0"))
        printf("Ready for OpenGL 2.0\n");
    else {
        printf("OpenGL 2.0 not supported\n");
    }
    return 0;
}

Обратите внимание, что окно по какой-то причине необходимо для теста OpenGL2.0.

person Steinbitglis    schedule 21.11.2009

Похоже, вы хотите связать с собственными библиотеками Win32 вместо X11. Добавьте -L / lib / w32api. В противном случае вам необходимо выполнить линковку с библиотеками X11 (-L / usr / X11R6 / lib -lX11 -lXi -lXmu), чтобы избавиться от ошибок компоновщика glX *.

person Judge Maygarden    schedule 23.12.2008

Вам подействовали какие-либо предыдущие предложения?

Я не понимаю, сталкиваетесь ли вы с проблемами при компоновке или компиляции GLEW. Я использую GLEW, включая источник, и раньше использовал ссылки.

Если вы хотите скомпилировать GLEW, убедитесь, что вы выбрали правильный почтовый индекс, так как скрипты кода на основе * nix могут некорректно работать под Windows (не уверен в Cygwin).

GLEW должен быть первым в заголовке и порядке связывания.

person Ketan    schedule 03.11.2009