Kompilacja Prosty statyczny program OpenGL 4.0 wykorzystujący MinGW, freeglut i glew
Problem jest w tytule, postaram się wymienić to, co już wypróbowałem i tak dalej poniżej.
Po pierwsze, w moim rozumieniu, aby korzystać z OpenGL 4.0 w systemie Windows, należy rozszerzyć lub pominąć domyślną bibliotekę systemu Windows, ponieważ jest ona dostarczana tylko z OpenGL 1.1.
Mamy więc zainstalowany MinGWC:/MinGW/
. Następnie konfiguruję FreeGLUT, pobierająctarball zStrona projektu. Rozpakuj i skompiluj, uruchamiając pliki makefile zgodnie zinstrukcje z niewielkim dodatkiem--prefix
do./configure
dowództwo.
./configure --prefix=/c/Users/Owner/root/
make all
make install
Teraz mam freeglut/c/Users/Owner/root/lib/
, /c/Users/Owner/root/include/
i tak dalej. Następna jest GLEW, moje problemowe dziecko, o ile mi wiadomo.
Pobierz archiwum źródłowe zstrona projektu (link bezpośredni 1.7.0.zip). Kompilacja jest nieco bardziej skomplikowana, mój obecny przepis pochodzi z pytania o przepełnienie stosu ”Budynek wznosił się na oknach z mingw „. Skrócona forma znajduje się poniżej:
mkdir lib/
mkdir bin/
gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c
gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32.a src/glew.o
gcc -DGLEW_NO_GLU -DGLEW_MX -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.mx.o -c src/glew.c
gcc -shared -Wl,-soname,libglew32mx.dll -Wl,--out-implib,lib/libglew32mx.dll.a -o lib/glew32mx.dll src/glew.mx.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32mx.a src/glew.mx.o
i powinien być uruchamiany z „korzenia”/path/to/glew-1.7.0/
.
Teraz z ustawieniem bibliotek „gotowe” (zakładając brak błędów ...) kompilowanie mojego prostego programu odbywa się za pomocą tej linii.
${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32 -I ${ROOTPATH}/include -L ${ROOTPATH}/lib --static
Teraz, aby trochę to rozłożyć i przejrzeć, dlaczego mam różne „dodatkowe” argumenty i pokazać, jakie błędy i problemy już przeszedłem i rozwiązałem.
-DFREEGLUT_STATIC
i-lfreeglut_static
są używane zamiast normalnych-lfreeglut
ponieważ chcemy tutaj kompilacji statycznej. Niezastosowanie się do tego powoduje błędy linkera związane z freeglut.-DGLEW_STATIC
jest dodawany z tego samego powodu.-lwinmm
dodaje się, aby naprawić błąd linkera:freeglut_init.c:(.text+0x5d9): undefined reference to '_timeBeginPeriod@4'
.-lgdi32
dodaje się, aby naprawić błąd linkera:c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '_GetDeviceCaps@8'
Teraz mam problem z następującym błędem linkera:
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0x83e8): undefined reference to `_glGetString@4'
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa1b2): undefined reference to `_glGetString@4'
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa290): undefined reference to `_glGetString@4'
Minimalny przypadek testowy powodujący ten błąd (main.cpp
) jest.
#include <GL/glew.h>
#include <GL/freeglut.h>
int main(int argc, char **argv) {
glEnableVertexAttribArray(0);
}
Pomysły?