[Megoldva] Qt 4.8.3 forras forditasa RTTI tamogatassal a dynamic_cast-hoz Win32 alatt.

 ( hanischz | 2012. október 22., hétfő - 17:32 )

Udv

A forditashoz az alabbi kapcsolokat hasznaltam:

configure -platform win32-g++ -debug-and-release -rtti -exceptions -no-phonon -no-phonon-backend -fast -opensource -shared -qt-sql-mysql -l mysql -I c:\mysql\include -L c:\mysql\lib\opt

mingw32-make

Az altalam irt projektben hasznalom a dynamic_cast-ot a qgraphicsitem_cast helyett mert az utobbi remekul nem ter vissza 0-val ha nem sikerult a cast muvelet. Viszont a Qt 4.8.3 eseten forditaskor allandoan:

dynamic_cast_will_always_fail_because_rtti_is_disabled

hibauzenetet kapok. Pedig -rtti kapcsoloval forditottam. Google-ben nem talaltam infot az ujabb Qt 4.8.3 forras dynamic_cast kompatibilitassal kapcsolatban. Erdekesseg hogy a QtSDK-ban levo korabbi Qt4.8.0-val nincs problema dynamic_cast eseten.

Koszonom az otelteket, segitseget ezzel kapcsolatban.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Nem fejlesztek Windows-on es idom sincs jelenleg, hogy felhuzzak egy virtualis gepet es felrakjam ra a kerdeses Qt-t, de szerintem elsokorben megoldhatod a problemat ugy, hogy a projekt fajlodban a konfiguraciot kibovited az adott feature-rel. Ez ennyi lenne: CONFIG += rtti

A "feature fajlokat" (.prf) a mkspecs konyvtarban talalod, pl. az RTTI-nek megfelelo a mkspecs\features\win32 konyvtarban kell, hogy legyen. Ezeket hozzafuzheted a projektedhez, ha valamiert a default nem lenne szamodra megfelelo.

Tovabba a mkspecs konyvtarban van egy qconfig.pri is, vess ra egy pillantast, mi van benne. A CONFIG-nak tartalmazni kellene az rtti feature-t. Majd ha lesz idom este foglalkozom a problemaval, jelenleg csak ennyire futotta ;)

reloaded:
Ja, elfelejtettem irni, hogy a Qt-t persze nem kell leforditanod, ennek mennie kell az eredetivel ;)

Engem meg erdekelne, hogy hogyan hasznaltad a qgraphicsitem_cast()-ot, mert annak is illene mukodnie. Nem beszelve arrol, hogy az vegulis csak egy static_cast, ami elonyosebb, hacsak nincs _valoban_ szukseged a dynamic_cast-ra, amit ketlek.

Koszonom! Ez volt a megoldas. (CONFIG += rtti a projekt fajlba)

Muszaj leforditanom mert a gepem nincs az internetre kotve csak a belso halora es inkabb letoltottem a forrasat a Qt 4.8.3-nak. Illetve a mysql tamogatas miatt.

Olyan nagyon nem neztem meg a qgraphicsitem_cast-ot, valoszinu at tudnam alakitani a grafikus osztalyokat, atirva a type()-okat de egyelore hagyom a dynamic_cast-okat. A kulonbozo tipusu grafikus objektumokat listara fuzve adtam at es ott hasznaltam konvertalas soran hogy megfelelo pointereket kapjak. Csak egy bizonyos tipusu vagy annak leszarmazottait hasznalom fel abban a kod reszletben.

Meg egyszer koszonom!!!!!

Ilyen esetekre a visitor pattern a megoldás; elsőre nem biztos, hogy egyéretelmű a működése, de érdemes megérteni, és ezt használni dynamic_cast helyett, még akkor is, ha többmindent át kell szervezni miatta.

Nagyon koszonom az infot, ez uj nekem.

Np. De ne felejtsd el, hogy ez csak egy workaround. A CONFIG += rtti most egy plattform fuggoseget jelent a projekt fajlodban, ami ugyan ignoralva lesz, ha mas plattformon forditasz, megsem tul elegans (persze csinalhatsz kulon configokat a mindenkori celplattformoknak megfeleloen).

Egyebkent, ha tegnap este nem is, de ma reggel volt par percem a dologgal foglalkozni es mivel talaltam a sufniban egy Windows XP VM-et, feltoltam ra ket Qt verziot. Es lass csodat:
Qt 4.6.4: CXXFLAGS = -g -frtti -fexceptions -mthreads -Wall $(DEFINES)
Qt 4.8.3: CXXFLAGS = -g -Wall -Wextra -fno-exceptions -fno-rtti $(DEFINES)

A kerdes most persze az, hogy ez a viselkedes tudatos-e, vagy csak a framework rossz sorrendben olvassa be a konfiguracios fajlokat? De ezt kinyomozni mar tenyleg nem volt idom, igy hat tovabbi infoval jelenleg nem szolgalhatok. Viszont, ha tobb projekted van es nem akarod a projekt fajlokat a fenti workarounddal megtuzdelni, megvaltoztathatod a mkspecs\features\win32\default_pre.prf tartalmat, ott ugyanis alapbol ki lesz kapcsolva ez-az (egyebkent ennek a fajlnak a tartalma mindket Qt verzional azonos, tehat kesobb megy felre valahogy a dolog). De ez is csak egy workaround, viszon legalabb "kozponti" :)