Common Qt compile errors/hu: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
Egy rövid gyűjtemény azokról a fordítási/futtatási hibákról, amelyek kiskoromban sok bosszúságot és fejtörést okoztak nekem. | Egy rövid gyűjtemény azokról a fordítási/futtatási hibákról, amelyek kiskoromban sok bosszúságot és fejtörést okoztak nekem. | ||
Vannak köztük banális problémák illetve olyanok is amiknek semmi köze Qt-hoz. Sok moc-al kapcsolatos problémát azóta a QtCreator azóta okosan megold magától. | |||
1. <code>expected initializer before 'class'<code> | 1. <code>expected initializer before 'class'<code> | ||
Line 23: | Line 24: | ||
6. </code>undefined reference to `vtable for classname`</code> olyan osztályban ami a QObjecttől származik. | 6. </code>undefined reference to `vtable for classname`</code> olyan osztályban ami a QObjecttől származik. | ||
Ugyebár ha az osztályainkban szignálokat, slotokat akarunk használni akkor a QObjecttől származtatjuk őket, és | Ugyebár ha az osztályainkban szignálokat, slotokat akarunk használni akkor a QObjecttől származtatjuk őket, és | ||
az osztálydeklaráció elején megejtünk egy Q_OBJECT makrót. Ha ezt utólag tesszük meg valószínűleg nem fogja átzavarni a mocon. | |||
Legegyszerűbb megoldás: make clean && qmake && make | |||
7. <code>'classname' has not been declared<code> habár az | 7. <code>'classname' has not been declared<code> habár az >osztályneve< osztályt már beincludoltad. | ||
Ilyen akkor szokott leggyakrabban előfordulni, ha van a és b osztályod, és a tartalmaz b valamint b tartalmaz a típusú objektumokat. | |||
Megoldás: az osztálydeklarációk (pl. a) előtt meg kell adni azt, hogy a hiányolt osztály létezik: (hint: foward declaration) | |||
</code> | |||
class a; | |||
class b | |||
{ | |||
… | |||
private: | |||
a m_object_a; | |||
} | |||
<code> | |||
8. </code>Multiple types in one declaration</code> egy headerben több osztály definiálásakor. | 8. </code>Multiple types in one declaration</code> egy headerben több osztály definiálásakor. | ||
Pontosvessző minden class deklaráció után. | |||
9. <code>Undefined reference to QObject::staticMetaCall()<code> mindez miután a Q_OBJECT makrót hozzáadtad. | 9. <code>Undefined reference to QObject::staticMetaCall()<code> mindez miután a Q_OBJECT makrót hozzáadtad. | ||
Tehát van egy osztályod amit valamiből (jellemzően QMainWindow, vagy QDialog stb) örökölsz, | |||
és egyéni slotokat/signalokat kívánsz hozzáadni. | |||
Megoldás: make clean, qmake, make | Megoldás: make clean, qmake, make | ||
Régi QtCreator esetén a rebuild all nem elég kell egy qmake elé. | |||
Ok: a fordító nem jön rá magától, hogy az adott fájlt át kell zavarni a mocon. | |||
Mit is szoktak mondani az angolok ilyenkor: Feel free to extend it! | Mit is szoktak mondani az angolok ilyenkor: Feel free to extend it! |
Revision as of 13:28, 25 February 2015
Egy rövid gyűjtemény azokról a fordítási/futtatási hibákról, amelyek kiskoromban sok bosszúságot és fejtörést okoztak nekem. Vannak köztük banális problémák illetve olyanok is amiknek semmi köze Qt-hoz. Sok moc-al kapcsolatos problémát azóta a QtCreator azóta okosan megold magától.
1.
expected initializer before 'class'<code>
Végignézni mindent, beszórni mindenhova a pontosvesszőt, az összes headerbe mindenhova.
2.
undefined reference to 'függvény neve'
A nevezett függvényt a headerben deklaráltad, de nem implementáltad.
3.
'classname' is not a namespace<code>
Nincs beincludolva az a header amiben az 'osztály' van.
4.
Invalid use of struct 'classname'
Ld. 3. pont
5.
undefined reference to 'slot neve'<code>
make clean qmake make vagy rebuild
6.
undefined reference to `vtable for classname` olyan osztályban ami a QObjecttől származik.
Ugyebár ha az osztályainkban szignálokat, slotokat akarunk használni akkor a QObjecttől származtatjuk őket, és az osztálydeklaráció elején megejtünk egy Q_OBJECT makrót. Ha ezt utólag tesszük meg valószínűleg nem fogja átzavarni a mocon. Legegyszerűbb megoldás: make clean && qmake && make
7.
'classname' has not been declared<code> habár az >osztályneve< osztályt már beincludoltad.
Ilyen akkor szokott leggyakrabban előfordulni, ha van a és b osztályod, és a tartalmaz b valamint b tartalmaz a típusú objektumokat.
Megoldás: az osztálydeklarációk (pl. a) előtt meg kell adni azt, hogy a hiányolt osztály létezik: (hint: foward declaration)
class a; class b { … private: a m_object_a; }
8.
Multiple types in one declaration egy headerben több osztály definiálásakor.
Pontosvessző minden class deklaráció után.
9. Undefined reference to QObject::staticMetaCall()
mindez miután a Q_OBJECT makrót hozzáadtad.
Tehát van egy osztályod amit valamiből (jellemzően QMainWindow, vagy QDialog stb) örökölsz,
és egyéni slotokat/signalokat kívánsz hozzáadni.
Megoldás: make clean, qmake, make
Régi QtCreator esetén a rebuild all nem elég kell egy qmake elé.
Ok: a fordító nem jön rá magától, hogy az adott fájlt át kell zavarni a mocon.
Mit is szoktak mondani az angolok ilyenkor: Feel free to extend it!