Einfaches statisches OpenGL 4.0-Programm mit MinGW, freeglut und glew kompilieren
Das Problem ist im Titel, ich werde versuchen, unten aufzulisten, was ich bereits ausprobiert habe und so weiter.
Wenn Sie OpenGL 4.0 für Windows verwenden möchten, müssen Sie zunächst die Standard-Windows-Bibliothek erweitern und / oder umgehen, da sie nur OpenGL 1.1 enthält.
Also haben wir MinGW bei installiertC:/MinGW/
. Als nächstes richte ich FreeGLUT ein, indem ich das herunterladeTarball von demProjektseite. Extrahieren und kompilieren Sie, indem Sie die Makefiles gemäß den Anweisungen von ausführenAnleitung mit einem kleinen Zusatz von--prefix
zum./configure
Befehl.
./configure --prefix=/c/Users/Owner/root/
make all
make install
Jetzt habe ich Freeglut in/c/Users/Owner/root/lib/
, /c/Users/Owner/root/include/
und so weiter. Als nächstes kommt GLEW, mein Sorgenkind, soweit ich das beurteilen kann.
Laden Sie das Quellarchiv von herunterdie Projektseite (Direkter 1.7.0.zip Link). Das Kompilieren ist etwas komplizierter, mein aktuelles Rezept leitet sich aus der Stapelüberlauf-Frage ab. "Gebäude glew auf Fenstern mit Mingw ". Eine abgekürzte Form ist nachstehend aufgeführt:
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
und sollte von der "Wurzel" von ausgeführt werden/path/to/glew-1.7.0/
.
Jetzt mit Setup der Bibliotheken "fertig" (vorausgesetzt, keine Fehler ...) Kompilieren mein einfaches Programm ist mit dieser Zeile fertig.
${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32 -I ${ROOTPATH}/include -L ${ROOTPATH}/lib --static
Nun, um dies ein wenig zu zerlegen und zu erläutern, warum ich verschiedene "zusätzliche" Argumente habe, und um Ihnen zu zeigen, auf welche Fehler und Probleme ich bereits gestoßen und diese behoben habe.
-DFREEGLUT_STATIC
und-lfreeglut_static
werden anstelle der normalen verwendet-lfreeglut
wie wir hier einen statischen Build wollen. Andernfalls treten Linker-Fehler im Zusammenhang mit freeglut auf.-DGLEW_STATIC
wird aus dem gleichen Grund hinzugefügt.-lwinmm
wird hinzugefügt, um den Linkerfehler zu beheben:freeglut_init.c:(.text+0x5d9): undefined reference to '_timeBeginPeriod@4'
.-lgdi32
wird hinzugefügt, um den Linkerfehler zu beheben:c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '_GetDeviceCaps@8'
Jetzt bin ich mit folgendem Linker-Fehler überfordert:
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'
Der minimale Testfall, der diesen Fehler erzeugt (main.cpp
) ist.
#include <GL/glew.h>
#include <GL/freeglut.h>
int main(int argc, char **argv) {
glEnableVertexAttribArray(0);
}
Ideen?