Компиляция минимального приложения GLEW под Cygwin - PullRequest
6 голосов
/ 23 декабря 2008

Давайте рассмотрим следующую программу и попробуем скомпилировать ее под 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 от NVIDIA SDK: VS, Cygwin, Cygwin с -D_WIN32. Я также попробовал сборку Cygwin оригинального 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 (не только ...).

Ответы [ 4 ]

6 голосов
/ 08 июня 2009

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

Второй способ использует библиотеки X11 glut glu gl. Они имеют более новый номер версии в своих заголовочных файлах (обратите внимание, что для использования расширений GL требуется> v1.2):
перенасыщение 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 / включают
-L / usr / X11R6 / lib -lXmu -lXi -lXext -lX11


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

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

3 голосов
/ 21 ноября 2009

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

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

Следующие страницы помогли мне решить эту проблему.

В основном мне пришлось определить _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.

1 голос
/ 23 декабря 2008

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

0 голосов
/ 04 ноября 2009

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

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

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

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

...