Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Pelien ohjelmointi Qt:lla ja OpenGL:llä

Sivun loppuun

Uinotin [30.03.2011 06:51:16]

#

Tehdessäni mobiilisovelluksia tykästyin Qt Creatoriin ja opin käyttämään sitä varsin hyvin. Nyt kun täytyisi palata takaisin tietokonepelejen pariin, käyttäisin mielelläni ohjelmoimiseen Qt:ta. En kuitenkaan tiedä kuinka paljon Qt:n QGLWidgetillä tehty OpenGL-peli-ikkuna syö resursseja suhteessa esim. glutilla tehtyyn peli-ikkunaan. Voinko siis jatkaa Qt:n käyttöä vai joudunko vaihtamaan johonkin muuhun API:in? Jälkimmäisessä tapauksessa haluaisin myös ehdotuksia Qt Creatorin käyttömukavuuden korvaavasta IDE:stä; paluu suoraan tekstitiedostoon kirjoittamiseen kuullostaa aika karulta.

Jokotai [30.03.2011 09:51:20]

#

Eri kielillä toteutetuilla OpenGL ikkunoilla ei pitäisi olla eroja.

jsbasic [07.04.2011 20:53:05]

#

Miten onnistuit käyttämään OpenGL:ää Qt:ssä?

Pitääkö projektiin kytkeä joku .dll? Mulla käätäjä valittaa jokaisesta OpenGL-funktiosta, että undefined reference.

Metabolix [07.04.2011 20:58:42]

#

OpenGL:n käyttöön tarvitaan 32-bittisessä Windowsissa opengl32.dll ja vastaava linkkeriasetus. Tuskinpa Qt asiaa miksikään muuttaa.

jsbasic [07.04.2011 21:20:53]

#

Tuntuu että olen ihan pihalla... Googletan puolituntia esim. hakusanoilla Qt ja dll josko löytyisi ohjeita miten .dll voitaisiin kytkeä linkittämiseen. Ei ainuttakaan neuvoa. Staattiseen linkittämiseen kyllä löytyy. (Vähän ihmetyttää miten linkittäminen voi olla staattista.)

Käytän siis Qt Creatoria, joka on IDE, joiden avulla parametrit yleensä kääntäjälle ja linkkerille asetetaan. Qt:ssä on qmake, mutta en tiedä vaikuttaako se asiaan...

Torgo [08.04.2011 12:42:44]

#

jsbasic kirjoitti:

Googletan puolituntia esim. hakusanoilla Qt ja dll josko löytyisi ohjeita miten .dll voitaisiin kytkeä linkittämiseen. Ei ainuttakaan neuvoa

Eipä qt:lla ja dll:n linkittämisellä mitään tekemistä keskenään olekaan, joten en ihmettele. Täältä löytyy ihan rautalankaohjeet:
http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9855

jsbasic kirjoitti:

Miten onnistuit käyttämään OpenGL:ää Qt:ssä?

QT:ssä jo itsessään on OpenGL piirtomoottori. Jos se ei riitä, vaan haluat valjastaa GPU:n ominaisuuksia laajemmin käyttöön, voit aivan hyvin sekoittaa joukkoon natiivia OpenGL:ää. Natiivi koodi kannattaa ympäröidä QPainterin funktioilla QPainter::beginNativePainting() ja QPainter::endNativePainting(). Tällöin et pääse vahingossa sekoittamaan QT:n GL-tilakonetta.

jsbasic [08.04.2011 13:20:17]

#

Torgo kirjoitti:

voit aivan hyvin sekoittaa joukkoon natiivia OpenGL:ää

Mutta tarvitsenko silloinkin sen .dll:n. Kokeilin lisätä QT += opengl .pro -tiedostoon, mutta se ei auta jos käytän OpenGL:ää tavalliseen tapaan winmainin kautta.

Metabolix [08.04.2011 14:33:13]

#

Torgo kirjoitti:

Täältä löytyy ihan rautalankaohjeet:

Kyse ei tainnut olla DLL:n linkittämisestä vaan opengl32.dll:n käytöstä omassa projektissa. Ja sehän onnistuu tunnetusti lisäämällä -lopengl32 linkkerin asetuksiin, jos kääntäjä on GCC tai jokin sen kanssa yhteensopiva.

Joka tapauksessa "qt" ja "dll" ovat vääriä hakusanoja, kun halutaan tietoa aiheesta "qt creator" ja "library". Näillä sanoilla löytyykin monta ohjetta, mm. tällainen:

LIBS += -L[path to lib] -l[name of lib]

Ohjeesta päätellen .pro-tiedostoon pitäisi ehkä lisätä tämä:

LIBS += -lopengl32

Polkua ei luultavasti tarvita, koska kirjaston pitäisi tulla kääntäjän mukana.

jsbasic [08.04.2011 15:19:00]

#

Kokeilin monenlaisia LIBsejä, mutta ei toimi.

Linkkeri valittaa myös että:
collect2: Id returned 1 exit status

Tuo taitaa johtua siitä ettei kääntäminen onnistu, mutta joissain ohjelmissani se valittaa ettei winmain()ia löydy vaikka pitäisi.

Muuten Qt ei taida olla PATHissa eikä ehkä MinGW:kään...

Kokeilin kyllä myös polun kanssa
LIBS += -L"C:\Windows\SysWOW64\opengl32"

Metabolix [08.04.2011 15:36:56]

#

Olet ilmeisesti ihan pihalla kirjastojen käytöstä. Etsipä jokin yleisesti kirjastoja käsittelevä opas, että saat edes perustiedot kohdalleen.

MinGW:llä projektiin ei linkitetä opengl32.dll-tiedostoa vaan libopengl32.a-tiedosto, jonka linkittämiseen käytetään asetusta -lopengl32. Windowsin PATHilla ei ole mitään tekemistä sen kanssa, mistä kääntäjä etsii kirjastoja.

Virheilmoitukset kannattaisi kopioida suoraan eikä kirjoittaa käsin (olet kirjoittanut ld:n väärin), ja kannattaisi myös poimia sieltä olennaisiakin osia eikä pelkkää lopputulosta ("linkitys epäonnistui" ei kerro mitään mahdollisesta syystä).

Selvitä myös kunnolla, mitä olet tekemässä. Teetkö 32-bittistä vai 64-bittistä ohjelmaa? Onko kyseessä Qt-ohjelma vai muu ohjelma? WinMain-funktiolla vai main-funktiolla? Entä mikä versio MinGW:stä sinulla on? Löytyykö MinGW:n lib-hakemistosta edellä mainittu OpenGL:n kirjastotiedosto?

(Edit: pyöräytin viestin uusiksi.)

jsbasic [08.04.2011 16:00:04]

#

lainaus:

Teetkö 32-bittistä vai 64-bittistä ohjelmaa? Mikä versio MinGW:stä sinulla on? Löytyykö MinGW:n lib-hakemistosta tarvittava kirjasto?

Hyviä kysymyksiä. Täältä löytyi jotain...

C:\MinGW\bin>gcc --version
gcc (GCC) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Mutta sitten on toinen, jonka Qt näköjään asensi (ilmeisesti siksi Qt-headerit eivät näy ensimmäisessä):

C:\Qt\2010.05\mingw\bin>gcc --version
gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Qt:n versio nro on 2010.05.

Kengän numeroni on 43.

Bittimääristä en tiedä.

libopengl32.a löytyy molemmista.

Metabolix [08.04.2011 16:15:15]

#

Jos aiot käyttää jatkossa vain Qt Creatoria, kannattaa ehkä poistaa toinen versio kääntäjästä.

Saatko käännettyä (komentorivillä ja QT Creatorilla) vaikka tämän?

#include <GL/gl.h>
int main() {
	glEnd();
	return 0;
}

jsbasic [08.04.2011 16:24:31]

#

Metabolix kirjoitti:

Jos aiot käyttää jatkossa vain Qt Creatoria, kannattaa ehkä poistaa toinen versio kääntäjästä.

OK. Mutta Qt:n asentama on vanhempi...

Metabolix kirjoitti:

Saatko käännettyä (komentorivillä ja QT Creatorilla) vaikka tämän?

Kyllä tuo näytti Qt Creatorissa starttaavan. Käytin nyt lausetta LIBS += -lopengl32.

Metabolix [08.04.2011 17:03:26]

#

No niin. Nyt enää teet saman tempun sen toisen projektisi kanssa – ei ole mitään syytä, miksei sama toimisi siinäkin.

jsbasic [08.04.2011 17:40:35]

#

Ei toimi.

Running build steps for project KoeOpenGL...
Configuration unchanged, skipping qmake step.
Starting: "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" -w
mingw32-make: Entering directory `C:/Users/jsbasic/Documents/CPP/KoeOpenGL-build-desktop'

C:/Qt/2010.05/mingw/bin/mingw32-make -f Makefile.Debug

mingw32-make[1]: Entering directory `C:/Users/jsbasic/Documents/CPP/KoeOpenGL-build-desktop'

g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"c:\Qt\2010.05\qt\include\QtCore" -I"c:\Qt\2010.05\qt\include\QtGui" -I"c:\Qt\2010.05\qt\include" -I"c:\Qt\2010.05\qt\include\ActiveQt" -I"debug" -I"..\KoeOpenGL" -I"." -I"c:\Qt\2010.05\qt\mkspecs\win32-g++" -o debug\koe2.o ..\KoeOpenGL\koe2.cpp

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\KoeOpenGL.exe debug/koe.o debug/koe2.o  -L"c:\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind -lopengl32 -lQtGuid4 -lQtCored4

debug/koe2.o: In function `WinMain@16':

C:\Users\jsbasic\Documents\CPP\KoeOpenGL-build-desktop/../KoeOpenGL/koe2.cpp:41: undefined reference to `GetStockObject@4'

C:\Users\jsbasic\Documents\CPP\KoeOpenGL-build-desktop/../KoeOpenGL/koe2.cpp:105: undefined reference to `SwapBuffers@4'

debug/koe2.o: In function `Z12EnableOpenGLP6HWND(HDC__ **, HGLRC__ **)':

C:\Users\jsbasic\Documents\CPP\KoeOpenGL-build-desktop/../KoeOpenGL/koe2.cpp:179: undefined reference to `ChoosePixelFormat@8'

C:\Users\jsbasic\Documents\CPP\KoeOpenGL-build-desktop/../KoeOpenGL/koe2.cpp:181: undefined reference to `SetPixelFormat@12'

collect2: ld returned 1 exit status

mingw32-make[1]: Leaving directory `C:/Users/jsbasic/Documents/CPP/KoeOpenGL-build-desktop'

mingw32-make[1]: *** [debug\KoeOpenGL.exe] Error 1

mingw32-make: Leaving directory `C:/Users/jsbasic/Documents/CPP/KoeOpenGL-build-desktop'

mingw32-make: *** [debug] Error 2

The process "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" exited with code %2.
Error while building project KoeOpenGL (target: Desktop)
When executing build step 'Make'

Mod. lisäsi kooditagit.

Metabolix [08.04.2011 17:47:43]

#

Hienoa, on ilmeisesti taas selvitelty aivan olematonta ongelmaa.

Kuten näet, puuttuvat funktiot ovat GetStockObject, SwapBuffers, ChoosePixelFormat ja SetPixelFormat. Ei pitäisi olla vaikeaa selvittää, missä kirjastossa ne ovat: gdi32. Joten lisääpä se vielä.

Toivottavasti muistat jatkossa kertoa jo aluksi, mitä virheilmoituksia ihan oikeasti tulee.

jsbasic [08.04.2011 18:19:34]

#

Ei se ongelma vielä kokonaan ratkennut. Nuo koeprojektit toimivat, mutta varsinainen projektini valittaa vielä samoista funktioista, vaikka kirjastot pitäisi olla kunnossa.

(Tämä on alunperin Code::Blocksin projekti jonka siirsin Qt Creatorille. Myös toinen projekti ei käynnisty.)

LIBS += -lopengl32
LIBS += -lgdi32
Running build steps for project Vuorikiipeilija...
Configuration unchanged, skipping qmake step.
Starting: "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" -w
mingw32-make: Entering directory `C:/Users/jsbasic/Documents/CPP/openGL/OpenGL/Vuorikiipeilija-build-desktop'

c:\qt\2010.05\qt\bin\qmake.exe -spec c:\Qt\2010.05\qt\mkspecs\win32-g++ -o Makefile ..\Vuorikiipeilija\Vuorikiipeilija.pro

WARNING: Failure to find: ..\main

WARNING: Failure to find: –

WARNING: Failure to find: Kopio.cpp

WARNING: Failure to find: ..\main

WARNING: Failure to find: –

WARNING: Failure to find: Kopio.c

WARNING: Failure to find: ..\Kopio

WARNING: Failure to find: ..\main

WARNING: Failure to find: –

WARNING: Failure to find: Kopio.h

WARNING: Failure to find: ..\main

WARNING: Failure to find: –

WARNING: Failure to find: Kopio.cpp

WARNING: Failure to find: ..\main

WARNING: Failure to find: –

WARNING: Failure to find: Kopio.c

WARNING: Failure to find: ..\Kopio

WARNING: Failure to find: ..\main

WARNING: Failure to find: –

WARNING: Failure to find: Kopio.h

mingw32-make: Leaving directory `C:/Users/jsbasic/Documents/CPP/openGL/OpenGL/Vuorikiipeilija-build-desktop'

mingw32-make: Entering directory `C:/Users/jsbasic/Documents/CPP/openGL/OpenGL/Vuorikiipeilija-build-desktop'

C:/Qt/2010.05/mingw/bin/mingw32-make -f Makefile.Debug

mingw32-make[1]: Entering directory `C:/Users/jsbasic/Documents/CPP/openGL/OpenGL/Vuorikiipeilija-build-desktop'

gcc -g -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_THREAD_SUPPORT    ../main.c   -o ../main

Makefile.Debug:185: warning: overriding commands for target `debug/somsolu.o'

Makefile.Debug:182: warning: ignoring old commands for target `debug/somsolu.o'

Makefile.Debug:218: warning: overriding commands for target `debug/piste.o'

Makefile.Debug:215: warning: ignoring old commands for target `debug/piste.o'

Makefile.Debug:235: warning: overriding commands for target `debug/main.o'

Makefile.Debug:169: warning: ignoring old commands for target `debug/main.o'

Makefile.Debug:238: warning: overriding commands for target `debug/main.o'

Makefile.Debug:235: warning: ignoring old commands for target `debug/main.o'

Makefile.Debug:247: warning: overriding commands for target `debug/main.o'

Makefile.Debug:238: warning: ignoring old commands for target `debug/main.o'

Makefile.Debug:250: warning: overriding commands for target `debug/–.o'

Makefile.Debug:241: warning: ignoring old commands for target `debug/–.o'

Makefile.Debug:253: warning: overriding commands for target `debug/Kopio.o'

Makefile.Debug:244: warning: ignoring old commands for target `debug/Kopio.o'

Makefile.Debug:270: warning: overriding commands for target `debug/Kopio.o'

Makefile.Debug:253: warning: ignoring old commands for target `debug/Kopio.o'

Makefile.Debug:273: warning: overriding commands for target `debug/main.o'

Makefile.Debug:247: warning: ignoring old commands for target `debug/main.o'

../main.c: In function 'WinMain':

../main.c:43: warning: assignment from incompatible pointer type

../main.c:62: warning: passing argument 2 of 'CreateWindowExW' from incompatible pointer type

c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include/winuser.h:3512: note: expected 'LPCWSTR' but argument is of type 'char *'

../main.c:62: warning: passing argument 3 of 'CreateWindowExW' from incompatible pointer type

c:\qt\2010.05\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include/winuser.h:3512: note: expected 'LPCWSTR' but argument is of type 'char *'

C:\Users\jsbasic\AppData\Local\Temp\ccaujyFP.o: In function `WinMain':

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:41: undefined reference to `GetStockObject@4'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:90: undefined reference to `glClearColor@16'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:91: undefined reference to `glClear@4'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:93: undefined reference to `glPushMatrix@0'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:95: undefined reference to `glBegin@4'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:97: undefined reference to `glColor3f@12'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:97: undefined reference to `glVertex2f@8'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:98: undefined reference to `glColor3f@12'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:98: undefined reference to `glVertex2f@8'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:99: undefined reference to `glColor3f@12'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:99: undefined reference to `glVertex2f@8'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:101: undefined reference to `glEnd@0'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:103: undefined reference to `glPopMatrix@0'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:105: undefined reference to `SwapBuffers@4'

C:\Users\jsbasic\AppData\Local\Temp\ccaujyFP.o: In function `EnableOpenGL':

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:179: undefined reference to `ChoosePixelFormat@8'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:181: undefined reference to `SetPixelFormat@12'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:184: undefined reference to `wglCreateContext@4'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:186: undefined reference to `wglMakeCurrent@8'

C:\Users\jsbasic\AppData\Local\Temp\ccaujyFP.o: In function `DisableOpenGL':

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:191: undefined reference to `wglMakeCurrent@8'

C:\Users\jsbasic\Documents\CPP\openGL\OpenGL\Vuorikiipeilija-build-desktop/../main.c:192: undefined reference to `wglDeleteContext@4'

collect2: ld returned 1 exit status

mingw32-make[1]: Leaving directory `C:/Users/jsbasic/Documents/CPP/openGL/OpenGL/Vuorikiipeilija-build-desktop'

mingw32-make[1]: *** [../main] Error 1

mingw32-make: Leaving directory `C:/Users/jsbasic/Documents/CPP/openGL/OpenGL/Vuorikiipeilija-build-desktop'

mingw32-make: *** [debug] Error 2

The process "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" exited with code %2.
Error while building project Vuorikiipeilija (target: Desktop)
When executing build step 'Make'

Metabolix [08.04.2011 18:33:46]

#

Näyttää siltä, että olet sotkenut jotain tiedostojen kanssa. Vai minkähän takia tuolla valitetaan sellaisista kuin ..\main, – ja Kopio.cpp, joista muodostuu yhdistettynä "..\main – Kopio.cpp"? Suosittelen, että teet uuden projektin ja olet vähän huolellisempi sen suhteen, mitä tiedostoja kopioit ja minne ja mitä niistä lisäät projektiin.

jsbasic [08.04.2011 19:37:48]

#

Poistin .pro-tiedostosta ylimääräiset viittaukset, ja herjaukset funktioista loppuivat.

Hienoa! Qt Creatorin käyttö näyttää nyt valoisammalta. Joitain includeja olen lisännyt, kun jokin vaatii niitä enemmän. Ja "merkkijonon" sijasta vaatii joskus L"merkkijonon". Katsotaan...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta