2012-06-27 12 views
5

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.

  1. -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.
  2. -DGLEW_STATIC viene aggiunto per lo stesso motivo.
  3. -lwinmm è aggiunto per correggere l'errore del linker: freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]'.
  4. -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?

+2

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

+1

@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

+0

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

risposta

4

Provare ad aggiungere l'ultimo -lopengl32 sulla linea per compilare il programma e vedere se è d'aiuto.

1

L'ordine degli argomenti è significativo con le opzioni del linker gcc.

Prova questa:

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

Inoltre, non credo che ci sia una doppia opzione-dash --static, appena -static.

E su win32 avremo bisogno di un successo glewInit() prima che il puntatore di funzione glEnableVertexAttribArray() sia valido. Dopo aver controllato la versione principale e/o l'estensione, ovviamente :)

+1

Questo aggiunge ulteriori reclami riguardo a un riferimento non definito a "_wglGetProcAddress @ 4". Probabilmente avrei dovuto dire che ho giocato con l'ordine degli argomenti. Quello che ho nella domanda è l'insieme di argomenti che fornisce la minima quantità di spam GCC. – nixeagle

+0

Sembra sia il lavoro '--static' che' -static'. Ho usato '--static' come opzione longform. – nixeagle

+1

Per quanto riguarda 'glewInit()', sì lo so. Ho inserito un test * minimo * che ha generato l'errore del linker. Avevo paura se inserissi 25 o 50 righe di codice C++, tutti si concentrassero sul codice. Riducendolo fino alle sole 6 righe che producono l'errore del linker, mi è sembrata di avere una risposta più veloce e più corretta. A parte il vero codice funziona per me su linux;). Ciò che ha effettivamente risolto il mio problema con Windows è spostare '-lopengl32' alla fine dell'elenco degli argomenti di gcc. Vedi i miei commenti sotto la domanda in risposta a Jite. – nixeagle

Problemi correlati