Qt VS CodeBlocks arba ‘kaip aš kūriau tinklų serverio programą’ II-oji dalis
Kadangi dažnai vadovaujuosi požiūriu(’share it!’), t.y. jeigu kažką žinai, kas gali būti naudinga kitiems, ir nepakenks tau pačiam, tuo pasidalink, tai va, truputi įvykių.
Visų pirma, tik perėjęs CGI -> HTML >~~> Pascal -> Php >~~> Pascal -> ASM -> C -> C++ -> Java -> C# -> Python >~~> Java -> C++ galiu pasakyti, kad C++ programavimas C++ (aš net nekalbu apie C) yra labai labai užknisantis, ir maždaug 2-3 kartus sudėtingesnis ir mažiau patogus nei netgi tokia kalba kaip Java. O pati java ir tokie toolsai kaip NetBeans dar nežinia kada prilygs tokiems toolsams kaip Visual Studio ir C# kalbai. Ir daugiausiai problemų atsiranda su C++ kalba tada, kaip prisireikia DEBUGGINIMO, GUI bei SOCKET”ų… Siaubizmas…
Taigi, mano idėja buvo tokia – paimti Java savo parašyti programą ir padaryti portą į C++.
Tokius dalykus jau yra tekę daryti – Php HipHop’e Php kodą keičiau į C++, C++ kodą į Php, pasiėmęs Java programą ją perrašinėjau Jython’ui (Python on Java), o Java programą perrašinėjau C#.
Ir galiu pasakyti, kad padaryti portą Java -> C++ buvo kol kas pati sudėtingiausia užduotis. Koks durnas yra C++ kodas kartais net keista.
Pvz. jeigu norite statinio metodo, tai headeryje rašote žodį static prieš metodo prototipą, o realizacijoje jau nebeįmanoma. Dar laimei kad yra toks dalykas kaip #include <vector>.
Tai va, pirmiausia Qt prieš mėnesį rašytame blogo įraše išvis išbrokavau kaip įrankį. Su Qt yra tekę susidurti ir prieš 3 mėnesius ir prieš pusmetį, vienam kursiokui darant operacinės sistemos projektą. Ir visus kartus aš Qt išbrokavau.
Bet pasirodo Qt buvo mano problemos vienas iš būtinų realizacinių sprendimų. O taip yra todėl, kad jis turi tikrai neblogą ‘debug’ą kodo rašymo (ne kompiliavimo metu). Jeigu CodeBlocks leidžia atidaryti Java projektą su *.cpp galunėmis ir nuėmus import, praktiškai pripažystą kaip VALID kodą. Todėl teko tą projektą atsidaryti su Qt programa, kuri mane būtent ir išgelbėjo. Pavyko paruošti pakankamai neblogą PORTą iš Java į C++. Tačiau kai ištaisiau dar vėliau kompiliavimo metu rastas klaidas, vėl susidūriau su Qt prastumu. Nepaisant prasto IDE, debugeris su “collect2: returned -1″ ir labai dideliu nenoru su SOCKET LIB’ais vėl išsekino mano kantrybės taurę. Todėl, viską ką buvau padaręs, persikėliau į CodeBlocks – IDE tūlsą su labai puikiu Debugeriu(kaip C++ kalbai), patogiu IDE, bei suknistu GUI kūrimu ir probleminių, ne kompiliavimo metu, klaidų radimu.
Na o Code::Blocks su Socketais dirba puikiai.
Jeigu yra nežinančių, kaip naudotis Echo Serveriu, tai atsakysiu:
1. Winsock 2 (libws2_32.a ) >>>>(daug geriau)>>>> Winsock I (libwsock32.a )
(T.y. Wsock2 yra FULL BACKWARDS COMPATIBLE su Wsock, ir turi naujų funkcijų, todėl geriau naudoti Wsock2.)
2. Taigi susikuriame ‘C++ Console Application’ projektą.
3. Tada ant projekto spaudžiame dešinį klavišą -> “Properties…”
4. Project settings kortelėle spaudžiame mygtuką “project’s build options…”
5. Atsidariusiame lange spaudžiame ant kortelės “linker settings”
6. “Link libraries:” bloke apačioje spaudžiame mygtuką “add”
7. Per [browse...] susirandame failą:
C:/MinGW/lib/libws2_32.a
arba (jeigu instaliavote MinGW kartu su CodeBlocks, nors, mano nuomone, tai blogas sprendimas, jeigu kaip ir aš naudojate kelis C++ IDE, o norite projektus mėtyti tarp vieno į IDE į kitą ir norite taupyti vietą)
C:/Program Files(x86)/CodeBlocks 10.05/MinGW/lib/libws2_32.a
8. Pridedame tą patį prie Debug ir prie Release.
9. Dabar mūsų serverį reikės paleisti per kažkokį tai portą, geriausiai virš 10000, ir nenaudokite 80 (IE), 8080 (TFS, PostgreSQL, Skype, WAMP), 8000 (Python+Django server), nes neveiks. Taigi, spaudžiame:
Meniu -> Project -> Set programs’ arguments…
10. Prie debug ir release pridedame dalyje “programs arguments:”, pvz. “10999″, t.y. Jūsų serverio porto numerį.
11. Viską išsaugome. Susikeliate C++ Example Echo server aplikaciją, tik visur header failuose padarome pakeitimus:
Kodą:
#include "winsock.h"
keičiame į:
#include "WinSock2.h"
Beje, Visual Studio ir Visual C++ irgi turi savo alternatyvą, tačiau man daug paprasčiau viską padaryti pavyko būtent ne su Visual C++, o su Code::Blocks.
Visual C++ ketinu naudoti tik tuomet, jeigu nepavyks kliento(ne serverio) programos sukurti naudojant GUI per Qt. Visual C++ ir Visual Studio GUI Jus gana smarkiai pririš prie Windows’ų, tuo tarpu Netbeans ir Swing, Qt ir Qt GUI, bei Code::Blocks ir WxWidgets (kuris man taip niekad ir nesusikompiliavo) yra platform-independent.
Pastaba: Qt projetų GUI buvo atsisakęs kompiliuoti vien dėl to, kad Windows 7 buvau paredagavęs ‘environment variables’ ir prie PATH pridėjęs MinGW kelią. Jis turi būti application-controled, o ne iš Windows’ų nustatomas. Šį dalyką buvau padaręs, nes to reikalavo WxWidgets, bet taip ir pamiršęs buvau nuimti, o WxWidgets kaip neveikė, taip ir neveikė.
Pastaba 2: C++ echo serverio pilno kodo pavyzdžių nebus, nes yra toks saitas:
