Set 302010
 

Se avete seguito le puntate sin dall’inizio, saprete che la scelta di wxWidgets e CodeBlocks (CB) è stata fatta non solo per svincolarmi dal vecchio e costoso Borland Builder, ma anche per affacciarmi alla possibilità di fare programmazione multiplatform, in particolare mi stuzzicava l’idea di convertire il mio software di domotica per funzionare in ambiente linux. Ma facciamo un passetto in dietro e cominciamo con le cose più semplici. Ricordate il
programmino che avevo preparato per la gestione di eventi custom in un thread secondario? Se avete seguito lo scorso articolo sicuramente avete scaricato il progetto già pronto e nonostante i miei avvertimenti avrete provato a compilarlo, cosa che avrà generato una miriade di errori. Questo è un problema frustante per chi provviene da ambienti integrati quali il Borland C Builder o VisulaStudio. Questi pacchetti software funzionano senza modifica in ogni PC per il semplice motivo che usano sempre lo stesso editor per la GUI, lo stesso compilatore, gli stessi include, le stesse librerie etc, etc, per cui gli basta conoscere la directory di installazione per funzionare in ogni PC.

CB non ha nulla a vedere con tutto ciò. E’ un’IDE (Integarted Development Environment – Ambiente di sviluppo integrato) generico che funziona con una miriade di compilatori e librerie diverse, debugger diversi, sistemi operativi diversi. Tutto ciò ha un prezzo che è legato alla complessità di configurazione, ma una volta riusciti nell’impresa la soddisfazione non avrà eguali. Quando andiamo a trasportare il nostro piccolo progetto su un’altro PC, anche a parità di sistema operativo, il probblema è legato al fatto che CB non trova le WxWidgets nella stessa directory che avevamo nel primo PC e ciò è quasi del tutto ovvio visto che molto probabilmente ogni PC avrà una directory di installazione differente. Ora vediamo come ovviare a questo problema. Come detto cominciamo dall’esempio più semplice quindi trasporteremo il nostro progettino da WindowsXP ad un’altro WindowsXP. Ricordate questa schermata? La potete riaprire da CB andando su Settings->Global Variables. L’abbiamo vista la prima volta che abbiamo creato un progetto con le WxWidgets. In soldoni CB definisce una variabile globale chiamata wx che contiene il percorso di installazione delle wxWidgets. Questo fatto ci torna molto utile in quanto in tutti i settaggi del compilatore possiamo sostituire il percorso con la variabile globale, in questo modo possiamo poi modificare tutti i riferimenti in un colpo solo. Si noti che nei path la variabil globale dovrà essere indicata come $(#wx). Nel video qui sotto possiamo vedere le modifiche apportate. Si noti che le modifiche devono essere fatte alla voce Events, dove vi sono le impostazioni generali comuni, ma anche su Debug e Release dove ci sono i vari link per produrre le versioni Debug e Release. Una volta eseguito i tutto e verificato che funziona ancora, possiamo trasportare il nostro progettino sul secondo PC. Se invece non dovesse funzionare, sicuramente abbiamo sbagliato la sostituzione, magari abbiamo tolto un pezzo importante del path, uno slash o quant’altro. Questo è il motivo per cui prima di fare questo genere di operazioni è bene fare sempre una copia di backup del nostro progetto. Nel mio caso la variabile globale wx è stata individuata in automatico dal secondo WindowsXP per cui ho potuto compilare il progetto senza alcuna modifica … spero che lo stesso valga anche per voi 🙂


Pensavate fosse finito qui? Manca ancora una risposta importante. Se CodeBlocks permette di definire variabili globali nelle sue impostazioni ed utilizza un Wizard che ci chiede la directory di installazione delle wxWidgets, perchè questo lavoro non lo fa in automatico ma lo dobbiamo fare noi manualmente? Ma infatti lo fà, solo che che al primo articolo avessi usato questo automatismo, ora non avrei avuto la possibilità di spiegarvi l’uso delle variabili globali e le problematiche nel trasferire un progetto da una piattaforma all’altra.   Vi ho preparato un nuovo video, qui sotto, che mostra come usare questa comodissima opportunità. Come potete vedere nel Wizard dopo aver settato la variabile globale wx, ci viene richiesto nuovamente la “wxWidgets location”, cosa che che ci trae in inganno anche perchè lasciandola su $(#wx) ci viene indicato un errore. Ma il trucco stà proprio nel non farsi intimidire dall’errore e lasciare tutto com’è senza specificare nessuna directory. Spero che anche questo articolo vi sia stato di aiuto, aspetto i vostri commenti.
E cosa facciamo se manualmente abbiamo alterato i path in modo errato e non abbiamo fatto il backup? Certo se il progetto è semplice ci mettiamo poco a rifarlo, ma lo scopo di queste righe è riuscire a salvarci da disastri apocalittici, magari in progetti molto grossi di cui sicuramente ci siamo scordati il backup proprio la volta in cui ci serviva. La cosa più semplice è questa: vi lascio una lista delle directory da includere. Per completezza vi segnalo che queste impostazioni le potete moificare anche “a mano” editando il file “.cpr” del progetto. Andate a dargli un’occhiata: è un semplice file XML qundi modificabile in maniera molto semplice.

Vi allego il file zippato con il progetto già modificato che potete trovare qui: Custom events and wxthread with global var (446 download )

  2 Responses to “CodeBlocks: creare progetti multiplatform (parte 1)”

  1.  

    Salve,sto seguendo la tua guida,ma ho un piccolo problema…compilando CD non mi trova il file: wx/setup.h
    puoi aiutarmi?Grazie per la risposta!

    •  

      Difficile aiutarti se non fornisci qualche dettaglio in +. Poi cosa intendi per CD? Se intendevi CodeBlocks mi chiedo perchè dovresti compilarlo visto che lo trovi già compilato. A meno che tu non voglia usare l’ultima build disponibile sotto linux, non ha molto senso compilarsi codeblocks se non per curiosità personale, ma è sicuramente un passo riservato a chi ha già un po’ di dimestichezza. Io l’ho fatto solo una volta ai tempi in cui non avevamo già la “pappa pronta” e dovevamo fare da noi. Nella mia guida non ho trattato la compilazione di codeblocks ma ho specificato i vari passaggi per utilizzarlo già bello che pronto. Al limite potrei scrivere un articoletto su questo argomento.