Sviluppo C++ multi-piattaforma con strumenti OpenSource
Gli strumenti di programmazione liberi per tutti i sistemi operativi
Davide “CD-RON” Rondini
Montebelluna Linux User Group
25 ottobre 2008 – Castelfranco Veneto
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 1 / 45
Licenza d’utilizzo
Copyright c© 2008, Davide “CD-RON” Rondini.Questo documento viene rilasciato secondo i termini della licenza Creative Commons(http://creativecommons.org).L’utente è libero di:
distribuire, comunicare al pubblico, rappresentare o esporre in pubblico lapresente opera
alle seguenti condizioni:
Attribuzione Deve riconoscere la paternità dell’opera all’autore originario.
Non commerciale Non può utilizzare quest’opera per scopi commerciali.
No opere derivate Non può alterare, trasformare o sviluppare quest’opera.
In occasione di ogni atto di riutilizzazione o distribuzione, deve chiarire agli altri i termini dellalicenza di quest’opera.Se ottiene il permesso dal titolare del diritto d’autore, è possibile rinunciare a ciascuna di questecondizioni. Le utilizzazioni libere e gli altri diritti non sono in nessun modo limitati da quantosopra. Questo è un riassunto in lingua corrente dei concetti chiave della licenza completa (codicelegale), reperibile sul sito Internethttp://creativecommons.org/licenses/by-nc-nd/2.0/legalcode
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 2 / 45
Sommario
1 Introduzione2 Il compilatore
Sistemi *NIXWindows
3 gestione progettiCMake
4 Librerie grafiche5 Version Control System
Subversion6 Installazione e distribuzione
CPackNSISPacchetti Linux (deb, rpm)
7 Bibliografia
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 3 / 45
Supportare più di un sistema operativo
Perché sviluppare multi-piattaformaRaggiungere un’utenza più ampia possibileSoftware di ampio utilizzoUnico sforzo di sviluppoMettersi al riparo dalle variazioni di mercatoRichieste diverse degli utentiNon appoggiare un monopolio
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 4 / 45
Supportare più di un sistema operativo
Perché C++?PrestazioniBase di librerie sterminataAccesso a basso livelloStandardizzazione(ISO/IEC 14882:2003)C’è almeno un compilatoreper piattaformaProgrammazioneobject-oriented
Regole generaliUtilizzare più possibile glistandard C++: ANSI, STLVerificare che le API che sivogliono usare sianoportabili (' Open Source)Definire i sistemi operativisupportati in fase diprogettazioneFare il debug in parallelo
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 5 / 45
GCC - GNU Compiler Collection
Perché GCCStandard de facto inambienti non-WindowsOpen SourceImplementa correttamentegli standardProduce binari con buoneprestazioniAffidabileSupporta decine dipiattaforme hardware
LinguaggiCC++Objective-CFortranJavaAda
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 6 / 45
Oltre il compilatore
Debuggergdb Estremamente
potente eflessibile, ilcompagnoideale di gcc.
valgrind Memorydebugger, utileper scovarememory leak.
Profilergprof Per ottimizzare almassimo il proprio codice.
IDEEclipse IDE nato per Java, ma
multi-linguaggio.Flessibile e potente,ma pesante.
kdevelop IDE di KDE,multi-linguaggio,orientato allo sviluppoKDE/Qt.
Anjuta IDE di Gnome,multi-linguaggio,oriantato allo sviluppoGnome/GTK.
vi/Emacs/joe Per i fan della riga dicomando
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 7 / 45
kdevelop
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 8 / 45
Eclipse
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 9 / 45
Anjuta
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 10 / 45
Apple MacOS
ToolsApple utilizza gcccomecompilatore, equindi molti deitool collegati,come gdb.
ToolsMacOS fornisceun IDEpreinstallato,XCode.
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 11 / 45
Compilatori Open Source per Windows
MinGWIn pratica un port di gcc per Windows, ma più limitato. Spesso serveinstallare librerie GNU per farlo funzionare.
Dev-C++Fondamentalmente un IDE per MinGW, basato su strumenti GNU(gdb, Cygwin).
OpenWatcomCompilatore prima commerciale, poi reso libero. Nato nel 1965 comecompilatore FORTRAN, molto diffuso negli anni ’80-’90, oggi moltomeno.
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 12 / 45
Compilatori gratuiti per Windows
Microsoft Visual C++Express
Ambiente di sviluppocompleto MicrosoftComprende compilatore,debugger, IDE, API(versione 2008)Dalla versione 2005 leversioni Express sonogratuite (non Open Source)
Perché usarloSoluzione nativa MicrosoftOttima integrazioneDebugger eauto-completamento di altolivelloIDE evoluto emulti-linguaggio
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 13 / 45
Visual C++ Express
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 14 / 45
Gestione progetti
Progetti nativi
*NIXMakefile
File di testointerpretati dal
programma make
Windowsvcproj/dsp/sln
File XML generati egestiti da Visual
Studio.nmake
Analogo a make perWindows.
Macxcodeproj/nib
Xcode gestisce ipropri file diprogetto...Makefile
...ma essendo *NIXè compatibile con
make.
È possibile utilizzare Makefile su tutte le piattaforme, con qualcheaccortezza.
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 15 / 45
CMake - Cross-platform Make
CMake è un sistema digenerazione di file di progettoper diversi compilatori epiattaforme.
CaratteristicheGenera i file di progettonativi per altri toolUsa una sintassi unificataOpen SourceSupporta moltissimicompilatoriSviluppato da Kitware Inc.Usato da KDE 4.xGUI o CLI
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 16 / 45
Come funziona CMake
Come è strutturatoGli script di progetto sichiamanoCMakeLists.txt
Ogni sotto-cartella ha unsuo CMakeLists.txt
CMake separa i file dicompilazione dai sorgentiLe librerie più comunivengono caricatefacilmente, tramite scriptgià forniti con CMake
CMake sotto Windows
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 17 / 45
Esempio di CMakeLists.txt 1/2
Cartella principale
1# Nome proge t to "HELLO" .2# C a r t e l l a de i so rgen t i : $ {HELLO_SOURCE_DIR }3# C a r t e l l a de i f i l e d i compi laz ione : $ {HELLO_BINARY_DIR } .4cmake_minimum_ requ i red (VERSION 2 . 6)5p r o j e c t (HELLO)6
7# I nd i ca l e s o t t o c a r t e l l e da compi lare8# Ciascuna deve contenere i l p rop r i o CMakeLists . t x t9add_ subd i rec to ry ( l i b r a r y )10add_ subd i rec to ry ( main )
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 18 / 45
Esempio di CMakeLists.txt 2/2
Cartella library
1# Crea una l i b r e r i a chiamandola He l lo2# Inc lude i l f i l e h e l l o . cpp3# I l nome del f i l e output e ’ automat ico4add_ l i b r a r y ( He l lo h e l l o . cpp )
Cartella main
1# Inc lude g l i header d e l l a l i b r e r i a He l lo2i nc lude _ d i r e c t o r i e s ( $ {HELLO_SOURCE_DIR } / He l lo )3# Aggiunge i l percorso d i l i n k d e l l a l i b r e r i a h e l l o4l i n k _ d i r e c t o r i e s ( $ {HELLO_BINARY_DIR } / He l lo )5# Crea l ’ esegu ib i l e6add_executable ( he l loMain main . cpp )7# Fa i l l i n k i n g d i h e l l o ne l main8t a r g e t _ l i n k _ l i b r a r i e s ( he l loMain Hel lo )
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 19 / 45
Le librerie grafiche
Cos’è e a cosa serve un toolkit graficoOggigiorno quasi tutte le applicazioni hanno una GUIPer il multi-piattaforma la scelta del toolkit grafico è critica.È essenziale minimizzare lo sforzo di porting con una libreriacomunePer l’utente è importante un aspetto grafico coerente tra le diverseapplicazioni
Open SourcewxWidgetsGTK+
Dual licensingQt
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 20 / 45
wxWidgets
wxWidgetswxWindows LicenseHa decine di bindings e diportCompila più o menoovunque esista uncompilatore ANSI C++.Usa le API native dellapiattaforma
ProOpen SourceDocumentazioneFacilità di programmazionePiattaforme e compilatorisupportati
ControMulti-threading pocoevolutoPoco noteEditor form poco evoluti ocommerciali
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 21 / 45
Qt
QtGPLv2 per Open Source,Proprietaria per sviluppocommercialeAlla base di KDESviluppato da Trolltech,oggi NokiaFramework completo(supporto del sonoro)
ProIntegrazione con KDEMolto evoluto e completoInnovativeQt designerPossibile supportocommerciale
ControLicenze commercialicostoseSupporto Visual Studiosolo commerciale
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 22 / 45
GTK+
GTK+/gtkmmLGPL 2.1Alla base di GNOMEDerivate dal progetto GIMPFanno parte del progettoGNUAPI C con wrapper C++ (ealtri)
ProOpen SourceOttimo supporto LinuxIntegrazione con GNOMEEssenziale e sempliceSupporto per l’accessibilità
ControSolo toolkit graficoCompilazione su Windowsnon immediataCompilabili su Windowssolo con MinGW
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 23 / 45
Controllo di versione
Il controllo di versioneSoftware per gestire lemodifiche al codice di unprogetto. Un VCS consente di:
Tenere traccia dellemodifichePoter tornare indietro erecuperare vecchieversioniGestire più programmatoriche lavorano in parallelosul codiceRamificazioni e sviluppoparallelo di più versioni
VCS e multi-piattaformaNello sviluppo multi-piattaformail controllo di versione diventaessenziale.Permette di mantenere unaversione di riferimento unificataper tutte le piattaforme.
Software Open SourceCVSSubversionBazaarMercurialGit
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 24 / 45
Come funziona il VCS 1/2
Il repositoryI file vengono gestiti da un server centrale, chiamato repository.Ciascun utente può creare una o più copie di lavoro
Il commitUna volta completate le modifice, l’utente le invia al serverIl software confronta i file e produce una nuova revisione.
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 25 / 45
Come funziona il VCS 2/2
L’updatel’utente confronta i propri file col repositoryNormalmente i file vengono fusi (merge)
La risoluzione di conflittiSe ci sono conflitti, li deve risolvere l’utente, poi eseguire il commit
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 26 / 45
Subversion (SVN)
CaratteristicheGestisce le versionianche delle cartelleForza a immettere uncommentoBackup e ripristinofacile del repositoryGestione efficente deifile binariIl commit è unaoperazione atomicaComandi avanzati dianalisi dati
Protocolli supportatiFile (cartella locale)WebDAV (http/https)ssh
kdesvn
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 27 / 45
Subversion per Windows: TortoiseSVN
TortoiseSVNClient SVN perWindowsSi integra in EsploraRisorseInteramente gestitoda menùcontestuale
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 28 / 45
Distribuire il proprio programma
l’ultimo passoNon sempre è sufficiente distribuire i sorgenticompressiPuò essere necessario configurare il sistema doveinstallareProblema della gestione delle dipendenzeIntegrazione con il sistema operativo
Il fattore chiave: l’utenteQuante installazioni si prevedono?Chi esegue l’installazione? Che esperienza ha?Che canale di distribuzione si vuole usare?
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 29 / 45
CPack
CPack...É il “fratello” di CMake perla pacchettizzazioneConsente con una sintassiunificata di crearepacchetti per differentipiattaforme e sistemi diinstallazionePuò funzionare con osenza CMake
...ma...Non funziona ancora benecome CMake, è completo soloda CMake 2.6
Cosa produce
TGZ tar + gzip
STGZ tar.gz auto-estraenti
NSIS Script NSIS
ZIP zip
TBZ2 tar + bzip2
TZ tar + Z
PackageMaker Mac OSX PackageMaker.
OSXX11 Mac OSX X11 Bundle.
RPM Red Hat Package
DEB Debian Package
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 30 / 45
NSIS Installer
Linguaggio di scripting per installatori WindowsNato per fare l’installatore di WinAmpPotente e flessibile
Cosa faCrea eseguibiliautoinstallantiEsegue altri programmiImposta chiavi del registrodi sistemaCrea un disinstallatoreautomaticoGestisce la licenzaE molto altro...
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 31 / 45
NSIS: script di esempio
Example1.nsi
1; Semplice script NSIS2; Chiede un percorso di installazione ,3; poi ci installa una copia di se stesso4
5Name "Example1" ; Nome dell’ installatore6OutFile "example1.exe" ; Il nome del file pacchetto7InstallDir $DESKTOP\Example1 ; Cartella di installazione di default8RequestExecutionLevel user ; Richiede i privilegi su Windows Vista9Page directory ; Imposta le pagine da installare10Page instfiles11Section " Installazione " ; Cosa installare12SetOutPath $INSTDIR ; Percorso di destinazione13File example1.nsi ; File da installare14SectionEnd ; Fine sezione
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 32 / 45
NSIS: Example1 in azione
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 33 / 45
I pacchetti: la soluzione Linux
I pacchetti in LinuxI programmi vengonoseparati dalle librerieLa gerarchia delle cartelleè stabilita da uno standard(FHS - FilesystemHierarchy Standard)Ogni pacchetto contiene iriferimenti alle propriedipendenzeI pacchetti vengono raccoltie distribuiti da server inrete (repository)
Vantaggi
Nessuna duplicazione dilibrerie
Unico sistema perinstallazione eaggiornamento
Reperibilità e sicurezza perl’utente
Svantaggi
Più complesso per losviluppatore
Più soluzioni, incompatibili traloro
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 34 / 45
RPM - Red Hat Package Manager
Cosa serveil pacchetto tar.gz con i sorgenticompilabiliUn makefile con le istruzioni diinstallazioneUn file nomepacchetto.spec con:
1 Nome e info pacchetto2 Versione3 Dipendenze4 Istruzioni di compilazione
Come si creaUsando rpmbuild.
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 35 / 45
DEB - Debian Package
Cosa serveI sorgenti in unacartellaUna sotto-cartelladebian con i file:
1 changelog2 README3 README.Debian4 copyright5 control6 rules
Come si creaUsando i pacchetti debuild,debhepler e dh-make.dh_make è in grado di creareautomaticamente i file necessaridebhepler ha delle utility pergestirli in maniera automatizzatadebuild genera il pacchetto
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 36 / 45
Riferimenti sul C++
Cplusplus.comhttp://www.cplusplus.com/
C++ su WikipediaInglese: http://en.wikipedia.org/wiki/C%2B%2BItaliano: http://it.wikipedia.org/wiki/C%2B%2B
Brian W. Kernighan, Dennis M. RitchieIl linguaggio C. Principi di programmazione e manuale di riferimento.Nuova edizione italiana, Pearson Education Italia, 2004 (ISBN88-7192-200-X)
Bjarne StroustrupC++ Linguaggio, libreria standard, principi di programmazione. IIIedizione, Pearson Education Italia, 2000 (ISBN 88-7192-078-3)
Bruce Eckel, Thinking in C++http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 37 / 45
Riferimenti sui compilatori
GCC Home Pagehttp://gcc.gnu.org/
William von HagenThe Definitive Guide to GCC, Second Edition, Apress, 2006 (ISBN1-59059-585-8)
MinGWhttp://www.wxwidgets.org/wiki/index.php/Supported_Platforms
Dev-C++http://www.bloodshed.net/devcpp.html
OpenWatcomhttp://www.openwatcom.org/index.php/Main_Page
Microsoft Visual Studio C++ Expresshttp://www.microsoft.com/express/vc/
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 38 / 45
Riferimenti sugli IDE
Eclipsehttp://www.eclipse.org/
kdevelophttp://www.kdevelop.org/
Anjutahttp://anjuta.sourceforge.net/downloads
XCodehttp://developer.apple.com/leopard/overview/
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 39 / 45
Riferimenti sulla gestione progetti
GNU Makehttp://www.gnu.org/software/make/
CMakehttp://www.cmake.org/
Ken Martin, Bill HoffmanMastering CMake 4th Edition, Kitware, Inc., 2008 (ISBN978-1930934207)
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 40 / 45
Riferimenti sulle librerie grafiche 1/2
wxWidgets Home Pagehttp://www.wxwidgets.org/
Presentazione sulle wxWidgetshttp://www.montellug.it/modules/mydownloads/visit.php?cid=6&lid=45
Julian Smart, Kevin Hock, Stefan CsomorCross-Platform GUI Programming with wxWidgets, Prentice Hall, 2006(ISBN 0-13-147381-6)
GTK+http://www.gtk.org/
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 41 / 45
Riferimenti sulle librerie grafiche 2/2
Qthttp://trolltech.com/
Alan Ezust, Paul EzustAn Introduction to Design Patterns in C++ with Qt 4, Prentice Hall, 2006(ISBN 978-0131879058)Pubblicato online:http://cartan.cas.suffolk.edu/oopdocbook/opensource/index.html
Tutorial Qt in italianohttp://www.digitalfanatics.org/projects/qt_tutorial/it/index.html
Licenze dei frameworkwxWidgets: http://www.wxwidgets.org/about/newlicen.htmQt: http://trolltech.com/products/appdev/licensingGTK+: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 42 / 45
Riferimenti sul controllo di versione 1/2
Il controllo di versionehttp://it.wikipedia.org/wiki/Controllo_versione
Subversionhttp://subversion.tigris.org/
Client Subversionhttp://en.wikipedia.org/wiki/Comparison_of_Subversion_clients
TortoiseSVNhttp://tortoisesvn.net/
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 43 / 45
Riferimenti sul controllo di versione 2/2
CVShttp://ximbiot.com/cvs/
Bazaarhttp://bazaar-vcs.org/
Mercurialhttp://www.selenic.com/mercurial/wiki/
Githttp://git.or.cz/
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 44 / 45
Riferimenti sulla pacchettizzazione
CPackhttp://www.cmake.org/Wiki/CMake:Packaging_With_CPack
NSIShttp://nsis.sourceforge.net/Main_Page
Maximum RPMhttp://www.redhat.com/docs/books/max-rpm/max-rpm-html/
Wikipedia RPMhttp://it.wikipedia.org/wiki/RPM_Package_Manager
Pacchetti Debianhttp://www.debian.org/doc/FAQ/ch-pkg_basics
Debian New Maintainers’ Guidehttp://www.debian.org/doc/maint-guide/
Davide Rondini (MontelLUG) Multi-piattaforma Open Source 25/10/2008 - Castelfranco V.to 45 / 45