Tekkis vajadus kirjutada pisike rakendus Linuxile, mis ei nõua palju mälumahtu ning selle avamine oleks kiire. Samas on ju tore, kui see töötab ka Windowsis. Harjumuslikult on mul arendusmasin Windows operatsioonisüsteemiga. Mis tööriistad sellisel juhul kõige paremini sobivad?

Mina valisin kõigepealt TDM GCC. Selle kohta, kuidas seda installeerida, sai kirjutatud ka üks artikkel.

CLion on selle poolest tore, et saab hästi läbi CMake-ga. Muidugi on CLion puhul veel palju toredat. Näiteks Android Studiole omased võimalused on sellelgi olemas. Koduleht toob välja olulisema:

  • navigeerimine
  • koodi genereerimine
  • refactoring

Minu arvates lahendab CLion ära just need puudused, mis on C++ puhul tüütu olnud. Navigeerimist on ju C++ puhul rohkem kui näiteks Java või C#-ga. Tuleb hüpata veel ka header failide vahel. Siis on hea, kui see on võimalikult mugav. Koodi genereerimine ei ole tihtipeale hea, sest ajalooliselt oleme tuttavad selliste koodi generaatoritega, mis ei tee just kõige paremat koodi või on täiesti suletud koodiga. Mis tundeid see meis tekitab, kui näeme faili alguses teksti "PLEASE DO "NOT" EDIT THIS FILE!"? CLion koodi genereerimine on siiski midagi muud. Vähema klahvivajutustega jõuab rohkem ja kõik on ka pärast muudetav. Refactoring võimalused on väga võimsad.

Kui hästi siis TDM GCC ja CLion hakkama saavad? Ekraanipilt näitab, et 100-protsendiliselt:

Linnukesed on ees nii MinGW, CMake, make, C Compiler, C++ Compiler kui ka GDB: 7.8 eest. Päris kõik versioonid ei ole toetatud, kuid praeguse TDM-GCC-32-ga meil probleeme pole.

 

wxWidgets ajalugu ulatub juba aastasse 1992. See on muljetavaldav. Paljud eelistavad QT-d, kuid selle kasutamine ei ole nii vaba, kui wxWidgets puhul.

Näiteks ka KiCad kasutab wxWidgets-i. Hiljuti sai kirjutatud ka artikkel, kuidas seda kokku kompileerida.

Linuxi masinas oli mul parajasti wxWidgets versioon 3.0.2. Panin siis Windowsi masinasse sama versiooni, pakkisin zip faili lahti asukohta C:\wxWidgets-3.0.2.

Avasin käsurea. Veendusin, et mingw32-make üles leitakse, ning läksin asukohta C:\wxWidgets-3.0.2\build\msw.

Andsin nüüd sellised käsklused, kompileerides 4 erinevat varianti:

mingw32-make -f makefile.gcc SHARED=0 UNICODE=1 BUILD=debug  CXXFLAGS="-std=gnu++11"

mingw32-make -f makefile.gcc SHARED=0 UNICODE=1 BUILD=release  CXXFLAGS="-std=gnu++11"

mingw32-make -f makefile.gcc SHARED=1 UNICODE=1 BUILD=debug  CXXFLAGS="-std=gnu++11"

mingw32-make -f makefile.gcc SHARED=1 UNICODE=1 BUILD=release  CXXFLAGS="-std=gnu++11"

Oluline oli ka võti CXXFLAGS="-std=gnu++11". Ilma selleta ebaõnnestus.

 

Edasi siis muidugi tahaks proovida, kuidas meie esimese wxWidgets ehitamine õnnestub. Lihtsa "Hello World" näite leiame aadressilt https://wiki.wxwidgets.org/Hello_World. Peame veel tegema sobiva CMakeLists.txt faili. Minul kukkus välja selline:

cmake_minimum_required(VERSION 3.3)
project(ClionWx)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")


set(wxWidgets_CONFIGURATION mswu)

set(wxWidgets_ROOT_DIR "C:/wxWidgets-3.0.2")

FIND_PACKAGE(wxWidgets COMPONENTS core base REQUIRED)
include(${wxWidgets_USE_FILE})


set(SOURCE_FILES HelloWorldApp.cpp)
if(WIN32)
    SET(BUILD_SHARED_LIBRARIES OFF)
    SET(CMAKE_EXE_LINKER_FLAGS "-static")
endif()
add_executable(ClionWx ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} ${wxWidgets_LIBRARIES})

Pidin vähemasti alguses lisama ka read:

if(WIN32)
    SET(BUILD_SHARED_LIBRARIES OFF)
    SET(CMAKE_EXE_LINKER_FLAGS "-static")
endif()

Muidu lihtsalt mu programmike ei käivitunud, vaid jooksis kokku.

Tulemus siis selline:

Linuxis siis vastavad käsklused:

 

 

 

Nüüd siis veel sellest, kuidas päriselt töö kallale asuda. Vormide disainiks valisin wxFormBuilder-i. Paistab, et seda kasutavad ka KiCad arendajad. Mõistlik on teha wxFormBuilder-iga baasklassid ja kõik enda meetodid panna tuletatud klassi. Selliselt toimides pole meil ohtu, et wxFormBuilder-ga täiendusi tehes meie kood ülekirjutamise tõttu kaotsi läheks. Omatehtud akna kasutuselevõtt on üsna lihtne. Hello World näites peame asendama ühe rea:

// wxFrame *frame = new wxFrame((wxFrame*) NULL, -1, _T("Hello wxWidgets World"));
MainFrameBase *frame = new MainFrameBase((wxFrame*) NULL, -1, _T("Hello wxWidgets World"));

 

Viiteid:

http://tdm-gcc.tdragon.net/

https://www.jetbrains.com/clion/

https://cmake.org/

http://developer.android.com/sdk/

https://www.wxwidgets.org/about/history/

http://www.qt.io/qt-framework/

http://stackoverflow.com/questions/32371877/is-wxwidgets-still-relevant-in-2015

http://codelite.org/Developers/BuildingWxWidgetsWin

https://wiki.wxwidgets.org/Compiling_wxWidgets_with_MinGW

https://cmake.org/cmake/help/v3.0/module/FindwxWidgets/

https://wiki.wxwidgets.org/Hello_World 

https://wiki.wxwidgets.org/CMake

http://stackoverflow.com/questions/24648357/compiling-a-static-executable-with-cmake

https://sourceforge.net/projects/wxformbuilder/