Il problema è nel titolo, cercherò di elencare ciò che ho già provato e così di seguito.Compilazione Semplice programma statico OpenGL 4.0 usando MinGW, freeglut e glew
Prima di tutto, a mio avviso, per poter utilizzare OpenGL 4.0 su Windows è necessario estendere o bypassare la libreria predefinita di Windows in quanto viene spedito solo OpenGL 1.1.
Quindi abbiamo installato MinGW allo C:/MinGW/
. Successivamente ho installato FreeGLUT scaricando il tarball dal project site. Estrarre e compilare eseguendo i makefile in base allo instructions con una piccola aggiunta di --prefix
al comando ./configure
.
./configure --prefix=/c/Users/Owner/root/
make all
make install
ora ho FreeGLUT in /c/Users/Owner/root/lib/
, /c/Users/Owner/root/include/
e così via. Il prossimo è GLEW, il mio problema bambino per quanto posso dire.
Scaricare l'archivio di origine da the project site (direct 1.7.0.zip link). La compilazione è un po 'più complicata, la mia ricetta attuale deriva dalla domanda di overflow dello stack "Building glew on windows with mingw". Una forma abbreviata è riportato di seguito:
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
e deve essere eseguito dalla "radice" /path/to/glew-1.7.0/
.
Ora, con l'installazione di librerie "done" (supponendo che non errori ...) compilare il mio programma semplice è fatto con questa linea.
${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32 -I ${ROOTPATH}/include -L ${ROOTPATH}/lib --static
Ora per decomporre questo un po 'e camminare attraverso questo che ho vari argomenti "extra" e per mostrare ciò che gli errori e problemi che ho già eseguito in e risolti.
-DFREEGLUT_STATIC
e-lfreeglut_static
sono usati al posto della normale-lfreeglut
come vogliamo un accumulo di elettricità statica qui. In caso contrario, si verificano errori del linker relativi a freeglut.-DGLEW_STATIC
viene aggiunto per lo stesso motivo.-lwinmm
è aggiunto per correggere l'errore del linker:freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]'
.-lgdi32
viene aggiunto per correggere l'errore del linker:c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '[email protected]'
Ora stumped con il seguente errore di linker:
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]'
Il banco di prova minima che produce questo errore (main.cpp
) è.
#include <GL/glew.h>
#include <GL/freeglut.h>
int main(int argc, char **argv) {
glEnableVertexAttribArray(0);
}
Idee?
Provare ad aggiungere l'ultimo -lopengl32 sulla linea per compilare il programma e vedere se è d'aiuto. EDIT: Probabilmente dovrebbe essere -lfreeglut_static come dice genpfault, ho letto troppo velocemente. – Jite
@Jite Funziona! (sul caso di test minimale) O.o Per favore, fai una risposta in modo da poterli sospendere e accettare. Non posso credere di essere riuscito a perdere una combinazione di argomenti GCC come ho provato a circa 12 set diversi! Ancora meglio se tu o qualcun altro potresti fornire alcune informazioni su _how_ per scegliere l'ordine delle librerie diverse dalle combinazioni di tentativi casuali. – nixeagle
Felice che abbia funzionato! Penso che qualcun altro dovrà spiegarlo in modo più approfondito, ma da quello che ho capito, correggimi se sbaglio, riguarda lo shadowing, come se due librerie definissero una funzione con lo stesso nome, l'ultimo collegato ombreggia il priore. – Jite