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.
Eri kielillä toteutetuilla OpenGL ikkunoilla ei pitäisi olla eroja.
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.
OpenGL:n käyttöön tarvitaan 32-bittisessä Windowsissa opengl32.dll ja vastaava linkkeriasetus. Tuskinpa Qt asiaa miksikään muuttaa.
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...
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/
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.
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.
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.
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"
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.)
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.
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; }
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
.
No niin. Nyt enää teet saman tempun sen toisen projektisi kanssa – ei ole mitään syytä, miksei sama toimisi siinäkin.
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.
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.
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'
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.
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...
Aihe on jo aika vanha, joten et voi enää vastata siihen.