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.
-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.-DGLEW_STATIC
wird aus dem gleichen Grund hinzugefügt.-lwinmm
hinzugefügt, um den Linker-Fehler zu beheben:freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]'
.-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?
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
@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
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