mercoledì 22 luglio 2009

Compilare QtOctave 0.8.2

Dopo aver compilato GNU Octave 3.2.2 ho compilato un programma che fornisce un'interfaccia grafica per Octave: QtOctave. La versione che ho scaricato è l'ultima disponibile a oggi, la 0.8.2, rilasciata poche settimane dopo la versione 3.2 di GNU Octave.

Anche in questo caso consiglio a chi non può o non vuole compilare questi programmi di scaricare i pacchetti precompilati per Ubuntu di Octave 3.2 + QtOctave 0.8.2 dal sito http://tobal.cymaho.com/?p=920.

L'URL per scaricare i sorgenti di QtOctave può essere trovato a questo indirizzo: http://qtoctave.wordpress.com/download/, in particolare la versione che ho scaricato si ottiene da http://forja.rediris.es/frs/download.php/1383/qtoctave-0.8.2.tar.gz. Scompattate l'archivio in una cartella, aprite un terminale (ApplicazioniAccessoriTerminale) e spostatevi (nel terminale con il comando cd) nella cartella in cui avete scompattato il sorgente. Se per esempio è la cartella ~/Scrivania/qtoctave-0.8.2 (ricordo che la tilde ~ è l'abbreviazione della home dell'utente corrente) dovete dare il comando
cd ~/Scrivania/qtoctave-0.8.2
Come per ogni compilazione, è necessario installare i compilatore, che si ottengono installando il pacchetto build-essential. Questo può essere installato da Synaptic, oppure da terminale con il comando
sudo apt-get install build-essential
Dopo di ciò bisogna installare i pacchetti necessari per la compilazione di QtOctave con il comando
sudo apt-get build-dep qtoctave
Nel file readme.txt che si trova nella cartella dei sorgenti spiega che bisogna inoltre installare le librerie Qt e i pacchetti di sviluppo Qt, dalla versione 4.5.0 in poi. È sufficiente installare il pacchetto libqt4-dev , tutti le dipendenze verranno installate automaticamente. Inoltre bisogna installare il pacchetto cmake. Senza aver installato le librerie Qt sarebbe comparso il seguente messaggio di errore in fase di compilazione:
CMake Error at /usr/share/cmake-2.6/Modules/FindQt4.cmake:1472 (MESSAGE):
Qt qmake not found!
Call Stack (most recent call first):
CMakeLists.txt:22 (FIND_PACKAGE)


-- Configuring incomplete, errors occurred!

A questo punto, nel file readme.txt viene consigliato di creare una cartella chiamata build ed eseguire una serie di comandi elencati. In questo modo, però, ho rilevato numeri errori in fase di compilazione di questo tipo:
[ 44%] Building CXX object easy_plot/src/CMakeFiles/easy_plot.dir/main.o
In file included from /home/luke/qtoctave-0.8.2/easy_plot/src/main.cpp:3:
/home/luke/qtoctave-0.8.2/easy_plot/src/main_window.h:7:35: error: ui_design_main_window.h: Nessun file o directory
/home/luke/qtoctave-0.8.2/easy_plot/src/main_window.h:9:27: error: ui_view_angle.h: Nessun file o directory
In file included from /home/luke/qtoctave-0.8.2/easy_plot/src/main.cpp:3:
/home/luke/qtoctave-0.8.2/easy_plot/src/main_window.h:11: error: ‘Ui’ is not a namespace-name
/home/luke/qtoctave-0.8.2/easy_plot/src/main_window.h:11: error: expected namespace-name before ‘;’ token
/home/luke/qtoctave-0.8.2/easy_plot/src/main_window.h:18: error: ‘Ui_DesignMainWindow’ does not name a type
/home/luke/qtoctave-0.8.2/easy_plot/src/main_window.h:21: error: ISO C++ forbids declaration of ‘Ui_ViewAngle’ with no type
/home/luke/qtoctave-0.8.2/easy_plot/src/main_window.h:21: error: expected ‘;’ before ‘*’ token
make[2]: *** [easy_plot/src/CMakeFiles/easy_plot.dir/main.o] Errore 1
make[1]: *** [easy_plot/src/CMakeFiles/easy_plot.dir/all] Errore 2
make: *** [all] Errore 2

Oltre a questo mi sono comparsi altri errori simili. Li ho risolti copiando gli header file che vengono segnalati come mancanti da una sottocartella della cartella build creata, nella cartella in cui si trovano i sorgenti che compaiono nei messaggi di errore. Sono comunque riuscito a evitare tutto ciò nel seguente modo: dopo aver installato i pacchetti sopra elencati ho dato nel terminale (posizionato nella cartella in cui ho scompattato l'archivio) il comando
cmake .
(notate il punto dopo cmake che shell bash rappresenta un'abbreviazione della cartella corrente, infatti il comando cmake richiede come argomento la cartella in cui si trova un sorgente. Per maggiori informazioni consultate il manuale) a differenza di quanto spiegato nel file readme.txt (AGGIORNAMENTO: mi sono accorto che questa è proprio la procedura descritta in leeme.txt, forse l'autore si è dimenticato di aggiornare anche il file in lingua inglese). Poi ho proseguito con il comando
make
Dopo il make, per installare il programma si dovrebbe dare il comando
sudo make install
ma anche in questo caso ho preferito creare un pacchetto deb con e checkinstall. Per creare il pacchetto, senza installarlo, ho dato il comando
sudo checkinstall --install=no
Successivamente ho installato il pacchetto deb che è stato creato.

Aggiornamento: in questa discussione sul forum di Ubuntu ho aiutato a compilare QtOctave 0.8.2 l'utente simo2777, che però ha riscontrato qualche problema in più rispetto a me. Riporto qui gli errori e le soluzioni per completezza.
Primo problema:
[ 40%] Building CXX object easy_plot/src/CMakeFiles/easy_plot.dir/gnuplot_connection.o
/home/simone/Programmi/qtoctave-0.8.2/easy_plot/src/gnuplot_connection.cpp: In member function ‘void GnuplotConnection::standardOutputReady()’:
/home/simone/Programmi/qtoctave-0.8.2/easy_plot/src/gnuplot_connection.cpp:143: error: ‘printf’ was not declared in this scope
make[2]: *** [easy_plot/src/CMakeFiles/easy_plot.dir/gnuplot_connection.o] Errore 1
make[1]: *** [easy_plot/src/CMakeFiles/easy_plot.dir/all] Errore 2
make: *** [all] Errore 2

Soluzione (solo per il primo errore, per il successivo leggi più avanti): installare le dipendenze di qtoctave con il comando sudo apt-get build-dep qtoctave e (se non già presente) il pacchetto gnuplot con il comando sudo apt-get install gnuplot.
Secondo problema:
[ 43%] Building CXX object easy_plot/src/CMakeFiles/easy_plot.dir/gnuplot_connection.o
/home/simone/Programmi/qtoctave-0.8.2/easy_plot/src/gnuplot_connection.cpp: In member function ‘void GnuplotConnection::standardOutputReady()’:
/home/simone/Programmi/qtoctave-0.8.2/easy_plot/src/gnuplot_connection.cpp:143: error: ‘printf’ was not declared in this scope
make[2]: *** [easy_plot/src/CMakeFiles/easy_plot.dir/gnuplot_connection.o] Errore 1
make[1]: *** [easy_plot/src/CMakeFiles/easy_plot.dir/all] Errore 2
make: *** [all] Errore 2

Soluzione (trovata qui): includere nel file easy_plot/src/gnuplot_connection.cpp l'header cstdio, per esempio in questo modo:
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QHash>
#include <cstdio>

GnuplotConnection::GnuplotConnection(QObject *parent):QProcess(parent)


Terzo problema (simile a quello precedente):
[ 75%] Building CXX object qtoctave/src/CMakeFiles/qtoctave.dir/search_dialog.o
/home/simone/Programmi/qtoctave-0.8.2/qtoctave/src/search_dialog.cpp: In destructor ‘virtual SearchDialog::~SearchDialog()’:
/home/simone/Programmi/qtoctave-0.8.2/qtoctave/src/search_dialog.cpp:96: error: ‘printf’ was not declared in this scope
make[2]: *** [qtoctave/src/CMakeFiles/qtoctave.dir/search_dialog.o] Errore 1
make[1]: *** [qtoctave/src/CMakeFiles/qtoctave.dir/all] Errore 2
make: *** [all] Errore 2

Soluzione: come prima, includere l'header cstdio nel file
qtoctave/src/search_dialog.cpp aggiungendo la riga
#include <cstdio>
all'inizio.

2 commenti:

  1. ciao, ho seguito alla lettera le istruzioni che hai postato ed andati tutto a buon fine senza errori. Tuttavia non capisco una cosa, come mai il pacchetto che ho fatto si chiama

    qtoctave_0.8.2-1_i386.deb

    mentre invece quello già pronto da scaricare insieme ad octave 3.2 si chiama

    qtoctave_0.8.2-4_all.deb

    che differenze ci sono ? ciao e grz in anticipo ;)

    RispondiElimina
  2. Dipende dal criterio di numerazione scelto dal distributore del pacchetto. In genere, il numero prima del trattino (in questo caso 0.8.2) indica la versione del codice sorgente del programma originale, mentre il numero dopo il trattino (il 4) indica il numero di volte che è stata applicata una patch per modificare il codice sorgente.

    Per esempio, guarda il changelog del pacchetto qtoctave presente in Ubuntu: la prima versione della 0.8.1 aveva un 1 dopo il trattino a indicare che sono state applicate le prima patch. Il 22 marzo è stata caricata una nuova versione patchata dello stesso pacchetto e al posto dell'1 c'è il 2 (ma la versione di partenza è sempre la 0.8.1) e poi il primo aprile sono state applicate delle nuove patch e la versione è diventata 0.8.1-3.

    In sostanza, si tratta solo di convenzioni, non è nulla di fondamentale :D
    Ciao!

    RispondiElimina

I commenti inseriti vengono lasciati dall'autore degli stessi accettandone ogni eventuale responsabilità civile e penale.
Il curatore del blog si riserva la possibilità di eliminare messaggi contenenti frasi offensive o spam.