2012-06-27 24 views
5

Problem jest w tytule, spróbuję wymienić to, co już wypróbowałem i tak dalej.Kompilowanie Prosty statyczny program OpenGL 4.0 przy użyciu MinGW, freeglut i gfl

Po pierwsze, w moim rozumieniu, aby móc korzystać z OpenGL 4.0 w oknach, należy rozszerzyć lub pominąć domyślną bibliotekę okien, ponieważ jest to tylko OpenGL 1.1.

Mamy więc zainstalowany MinGW o numerze C:/MinGW/. Następnie konfiguruję FreeGLUT pobierając tarball z project site. Wyodrębnij i skompiluj, uruchamiając pliki makefile zgodnie z instructions z dodatkowym dodatkiem --prefix do polecenia --prefix do polecenia --prefix.

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

Teraz mam freeglut w /c/Users/Owner/root/lib/, /c/Users/Owner/root/include/ i tak dalej. Następnym etapem jest GLEW, moje problematyczne dziecko, o ile wiem.

Pobierz archiwum źródłowe z the project site (direct 1.7.0.zip link). Kompilacja jest nieco bardziej skomplikowana, moja obecna receptura wywodzi się z pytania przepełnienia stosu "Building glew on windows with mingw". Formą skrócie przedstawiono poniżej:

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 

i powinien być uruchamiany z „korzeń” z /path/to/glew-1.7.0/.


Teraz z konfiguracją bibliotek „done” (zakładając, że nie ma błędów ...) kompilowania mojego prostego programu odbywa się z tej linii.

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

Teraz rozkładać to nieco i spacer dlaczego mam różne argumenty „ekstra” i pokazać, jakie błędy i problemy Już napotkasz i rozwiązany.

  1. -DFREEGLUT_STATIC i -lfreeglut_static są stosowane zamiast normalnego -lfreeglut jak chcemy budować statycznego tutaj. Niewykonanie tej czynności powoduje błędy linkera związane z freeglut.
  2. -DGLEW_STATIC jest dodawany z tego samego powodu.
  3. -lwinmm został dodany, aby naprawić błąd łącznika: freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]'.
  4. -lgdi32 dodaje naprawić błąd linkera: c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '[email protected]'

Teraz jestem zakłopotany z powodu następującego błędu łącznikowej:

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]' 

Minimalna przypadek testowy, która produkuje ten błąd (main.cpp) jest.

#include <GL/glew.h> 
#include <GL/freeglut.h> 

int main(int argc, char **argv) { 
    glEnableVertexAttribArray(0); 
} 

Pomysły?

+2

Spróbuj dodać -lopengl32 na końcu, aby skompilować program i sprawdzić, czy to pomaga. EDYCJA: Powinien prawdopodobnie być -lfreeglut_static jak mówi genpfault, czytam zbyt szybko. – Jite

+1

@Jite To działa! (w minimalnym przypadku testowym) O.o Proszę, odpowiedz na to, abym mógł go przyjąć i zaakceptować. Nie mogę uwierzyć, że udało mi się ominąć kombinację argów GCC, tak jak próbowałem około 12 różnych zestawów! Jeszcze lepiej, jeśli Ty lub ktoś inny mógłbyś podać informacje o _how_, aby wybrać kolejność bibliotek inną niż losowe próby kombinacji. – nixeagle

+0

Cieszę się, że działało! Myślę, że ktoś inny będzie musiał to wyjaśnić głębiej, ale z tego, co rozumiem, popraw mnie, jeśli się mylę, chodzi o shadowing, tak jak jeśli masz dwie biblioteki definiujące funkcję o tej samej nazwie, ostatnia połączona wola cienia przeora. – Jite

Odpowiedz

4

Spróbuj dodać -lopengl32 ostatni na linii, aby skompilować program i sprawdzić, czy to pomaga.

1

Kolejność argumentów jest znacząca dla opcji linkera gcc.

Spróbuj tego:

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

Również nie sądzę, istnieje dwukrotnie kreska --static opcja, tylko -static.

A na win32 będziesz potrzebować udanego glewInit(), zanim wskaźnik funkcji glEnableVertexAttribArray() będzie ważny. Po sprawdzeniu podstawowej wersji i/lub rozszerzenia, oczywiście :)

+1

Dodaje to więcej skarg na "niezdefiniowane odniesienie do" _wglGetProcAddress @ 4 ". Prawdopodobnie powinienem wspomnieć, że grałem z kolejnością argumentów. W pytaniu mam zestaw argumentów, które dają najmniej spamu GCC. – nixeagle

+0

Wygląda na to, że działają zarówno "--static', jak i' -static'. Użyłem '--static' jako opcji longform. – nixeagle

+1

Jeśli chodzi o 'glewInit()' tak, wiem. Wstawiłem * minimalną * teczkę, która spowodowała błąd linkera. Bałem się, gdybym umieścił 25 lub 50 linii kodu C++, każdy skupiłby się na kodzie. Ograniczając go do zaledwie 6 linii, które powodują błąd łącznika, wydawało mi się, że uzyskałem szybszą i bardziej poprawną odpowiedź. Btw rzeczywisty kod działa dobrze dla mnie na Linuksie;). To, co faktycznie rozwiązało mój problem z systemem Windows, to przeniesienie '-lopengl32' na koniec listy argumentów gcc. Zobacz moje komentarze poniżej pytania w odpowiedzi na Jite. – nixeagle