2012-06-27 3 views
5

Das Problem ist im Titel, ich werde versuchen, zu listen, was ich bereits versucht habe und so weiter unten.Kompilieren Einfache statische OpenGL 4.0 Programm mit MinGW, freeglut und glew

Zunächst einmal, in meinem Verständnis, um OpenGL 4.0 auf Windows zu verwenden, müssen Sie erweitern und oder umgehen Sie die Standard-Windows-Bibliothek, da es nur OpenGL 1.1.

So haben wir MinGW bei C:/MinGW/ installiert. Als nächstes habe ich FreeGLUT eingerichtet, indem ich die tarball von der project site heruntergeladen habe. Extrahieren und kompilieren Sie, indem Sie die Makefiles gemäß der instructions mit einem kleinen Zusatz von --prefix zu dem Befehl ./configure ausführen.

./configure --prefix=/c/Users/Owner/root/ 
make all 
make install 

Jetzt habe ich in /c/Users/Owner/root/lib/, /c/Users/Owner/root/include/ und so weiter freeglut. Als nächstes kommt GLEW, mein Problemkind, soweit ich das beurteilen kann.

Laden Sie das Quellarchiv von the project site (direct 1.7.0.zip link) herunter. Kompilieren ist ein bisschen komplizierter, mein aktuelles Rezept ist von der Stapelüberlauffrage "Building glew on windows with mingw" abgeleitet. Eine abgekürzte Form ist unten 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“ des /path/to/glew-1.7.0/ ausgeführt werden.

Jetzt mit der Einrichtung der Bibliotheken "fertig" (vorausgesetzt, keine Fehler ...) Kompilierung meines einfachen Programms ist mit dieser Zeile abgeschlossen.

${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 durch das ein bisschen und gehen zu zersetzen, warum ich verschiedene „extra“ Argumente haben und Ihnen zeigen, was Fehler und Probleme, die ich bereits in und gelöst ausgeführt haben.

  1. -DFREEGLUT_STATIC und -lfreeglut_static werden anstelle der normalen -lfreeglut verwendet, da wir hier eine statische Aufladung wollen. Wenn Sie dies nicht tun, erhalten Sie Linker-Fehler in Bezug auf Freeglut.
  2. -DGLEW_STATIC wird aus dem gleichen Grund hinzugefügt.
  3. -lwinmm hinzugefügt, um den Linker-Fehler zu beheben: freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]'.
  4. -lgdi32 hinzugefügt, um den Linker-Fehler zu beheben: c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '[email protected]'

Jetzt bin ich mit dem folgenden Linkfehler stapfte:

c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0x83e8): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa1b2): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa290): undefined reference to `[email protected]' 

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?

+2

Versuchen Sie -lopengl32 zuletzt in der Zeile, um Ihr Programm zu kompilieren und sehen, ob es hilft. EDIT: Sollte wohl -freeglut_static sein wie genpfault sagt, lese ich zu schnell. – Jite

+1

@Jite Das funktioniert! (auf dem minimalen Testfall) O.o Bitte machen Sie dies eine Antwort, damit ich es aufheben und akzeptieren kann. Ich kann nicht glauben, dass ich eine Kombination von GCC-Argumenten vermisst habe, da ich ungefähr 12 verschiedene Sets probiert habe! Noch besser, wenn Sie oder jemand anders einige Informationen über _how_ zur Verfügung stellen könnte, um die Bibliotheksreihenfolge zu wählen, außer zufällig Kombinationen auszuprobieren. – nixeagle

+0

Froh, es hat funktioniert! Ich denke, jemand anderes wird es tiefer erklären müssen, aber nach dem, was ich verstehe, korrigiere mich, wenn ich falsch liege, es geht um Shadowing, als ob zwei Bibliotheken eine Funktion mit dem gleichen Namen definieren, die letzte verlinkt Schatten den Prior. – Jite

Antwort

4

Versuchen Sie -lopengl32 zuletzt in der Zeile, um Ihr Programm zu kompilieren und sehen, ob es hilft.

1

Argument Reihenfolge ist signifikant mit gcc Linker-Optionen.

Versuchen Sie folgendes:

${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -I ${ROOTPATH}/include -L ${ROOTPATH}/lib -lopengl32 -lwinmm -lgdi32 -lglew32 -static -lfreeglut_static 

Auch ich glaube nicht, gibt es eine Doppel-Bindestrich --static Option, nur -static.

Und auf Win32 werden Sie eine erfolgreiche glewInit() benötigen, bevor Ihr glEnableVertexAttribArray() Funktionszeiger gültig sein wird. Nach Überprüfung Ihrer Kern-Version und/oder Erweiterung, natürlich :)

+1

Das fügt weitere Beschwerden über 'undefinierte Referenz auf '_wglGetProcAddress @ 4' hinzu. Wahrscheinlich hätte ich erwähnen sollen, dass ich mit der Argumentationsreihenfolge gespielt habe. Was ich in der Frage habe, ist die Menge der Argumente, die die geringste Menge an GCC-Spam ergeben. – nixeagle

+0

Scheint so gut wie "static" und "static" funktionieren. Ich habe '--static' verwendet, wie es eine Longform-Option ist. – nixeagle

+1

Soweit 'glewInit()' geht, ja ich weiß. Ich habe einen * minimalen * Testfall erstellt, der den Linkerfehler erzeugt hat. Ich hatte Angst, wenn ich 25 oder 50 Zeilen C++ Code schreiben würde, würde sich jeder auf den Code konzentrieren. Durch die Reduzierung auf nur die 6 Zeilen, die den Linker-Fehler erzeugen, schien ich eine schnellere und korrektere Antwort erhalten zu haben. Übrigens funktioniert der eigentliche Code für mich auf Linux gut;). Was mein Windows-Problem tatsächlich gelöst hat, ist '-lopengl32' an das Ende der gcc-Argumentliste zu verschieben. Siehe meine Kommentare unter der Frage als Antwort auf Jite. – nixeagle

Verwandte Themen