renatoriv AT libero PUNTO it
.Il 18 febbraio 2011 è stata rilasciata la versione finale di QtiPlot 0.9.8.4, un programma per l'analisi dei dati, equivalente libero di Origin. Questa versione porta con sé numerose novità che potete leggere qui.
QtiPlot è un programma un po' particolare perché il codice sorgente è rilasciato con licenza GPL ma lo sviluppatore distribuisce i binari precompilati a pagamento. Ciò non è in alcun modo in contrasto con il concetto di software libero perché nella sua definizione non si parla di prezzo. La confusione di "software libero" con "software gratuito" è maggiormente presente nelle persone di lingua inglese, poiché in questa la parola "free" ha il duplice significato di "libero" e "gratuito". Anche chi usa questo software avendolo compilato da sé può fare una donazione a favore del progetto all'indirizzo http://soft.proindependent.com/why_donate.html per permettere allo sviluppatore di portare avanti il suo progetto.
In questo post spiegherò come fare a compilare QtiPlot. Questa guida è per Ubuntu Maverick Meerkat 10.10 (e probabilmente funzionerà senza troppi problemi anche per Debian), per le altre distribuzioni ci potranno essere piccoli differenze per quanto riguarda i comandi che richiamano il gestore dei pacchetti, i nomi dei pacchetti e la disponibilità di questi.
Innanzitutto cominciamo con l'installare tutte le dipendenze necessarie per la compilazione. In un terminale dare
sudo apt-get install build-essential sudo apt-get build-dep qtiplotIl primo comando installa (se non già presente, ma è difficile che non lo sia già) le utility necessarie per compilare la maggior parte dei programmi, il secondo installa le principali librerie che necessita QtiPlot per essere compilato. Nelle ultime versioni QtiPlot ha aggiunto altre dipendenze i cui pacchetti non sono disponibili nella versione di Ubuntu considerata, quindi prima di procedere con la compilazione di QtiPlot stesso dovremo compilare altri programmi.
Scarichiamo il codice sorgente di QtiPlot all'indirizzo http://download.berlios.de/qtiplot/qtiplot-0.9.8.4.tar.bz2. Da terminale si può usare
wget http://download.berlios.de/qtiplot/qtiplot-0.9.8.4.tar.bz2Scompattiamo l'archivio dove ci pare (se non siete in grado di farlo da terminale, vi ricordo che è possibile farlo attraverso interfaccia grafica) e spostiamoci con il terminale nella cartella in cui si trova il sorgente:
tar xjvf qtiplot-0.9.8.4.tar.bz2 cd qtiplot-0.9.8.4/Aprite il file
README.html
presente nella cartella del sorgente (è sempre buona norma leggere i file README
e/o INSTALL
, o simili, prima di procedere con la compilazione di un programma). Come potete vedere le dipendenze necessarie sono le seguenti: Qt (>= 4.5.0), GSL, muParser (1.32), zlib e libpng. Tutti questi pacchetti sono stati installati (se non erano già presenti) con il comando sudo apt-get build-dep qtiplot
. Inoltre servono delle versioni leggermente modificate delle librerie Qwt (5.2) e QwtPlot3D, ma queste sono presenti nella sottocartella 3rdparty/
del codice sorgente di QtiPlot, quindi non bisogna scaricare nulla di nuovo per questo elencato finora. Altre librerie suggerite sono QTeXEngine, ALGLIB (2.6) e TAMUANOVA.Compiliamo queste librerie. Salveremo i codici sorgenti di queste nella sottocartella
3rdparty/
, per comodità, quindi spostiamoci in questa cartella:cd 3rdparty/Scarichiamo e scompattiamo l'archivio contenente il codice sorgente di QTeXEngine:
wget http://download.berlios.de/qtiplot/QTeXEngine-0.3-opensource.zip unzip QTeXEngine-0.3-opensource.zip cd QTeXEngineCompiliamo la libreria (le istruzioni sono presenti nel file
README.txt
:qmake makeSe tutto è andato bene (lo potete controllare guardando l'exit status con il comando
echo $?
, se è 0
allora l'operazione si è conclusa correttamente) torniamo nella cartella superiore, scarichiamo il codice sorgente di ALGLIB e compiliamolo:cd .. wget http://www.alglib.net/translator/re/alglib-2.6.0.cpp.zip unzip alglib-2.6.0.cpp.zip ; mv cpp alglib cd alglibLe istruzioni per la compilazione di questa libreria sono presenti nel file
manual.cpp.html
. Bisogna eseguire lo script build
passando come argomento il compilatore da usare, nel nostro caso GCC. Lo script build
non ha i permessi di esecuzione, quindi prima di avviarlo dobbiamo rendere il file eseguibile:chmox +x build ./build gccSe anche questa operazione si è conclusa con successo (controlliamo l'exit status con
echo $?
: se otteniamo 0 allora è andato tutto bene) andiamo avanti possiamo compilare TAMUANOVA. Spostiamoci nella cartella superiore, scarichiamo il codice sorgente di TAMUANOVA, scompattiamo l'archivio ed entriamo nella cartella del codice sorgente di questa libreria:cd .. wget http://www.stat.tamu.edu/~aredd/tamuanova/tamu_anova-0.2.tar.gz tar xzvf tamu_anova-0.2.tar.gz ; mv tamu_anova-0.2/ tamu_anova/ cd tamu_anova/Compiliamo questa libreria (le istruzioni sono presenti nel file
INSTALL
):./configure makeControllate l'exit status con
echo $?
. Se ottenete 0
la compilazione è andata a buon fine. Non è necessario installare la libreria (come neanche le precedenti), è sufficiente averla compilata. Prima di procedere dobbiamo modificare un file: 3rdparty/qwtplot3d/qwtplot3d.pro
. Questo file contiene le istruzioni per la compilazione della libreria QwtPlot3D (che avverrà successivamente quando compileremo QtiPlot). Alla fine di questo file bisogna aggiungere la seguente riga:unix:CONFIG += staticlib
affinché venga compilata staticamente (suggerimento tratto da qui).Ritorniamo con il terminale nella cartella principale del codice sorgente di QtiPlot (che si trova due cartelle superiori rispetto alla carella di ALGLIB in cui ci trovavamo prima):
cd ../..Prima di iniziare la compilazione vera e propria ci sono ancora diverse operazioni da fare. Prima di tutto dobbiamo creare un file chiamato
build.conf
da posizionare nella cartella del codice sorgente di QtiPlot e che contiene alcune istruzioni che servono per la compilazione. Questo file dovrà essere realizzato sulla base del modello build.conf.example
che si trova nella stessa cartella. Per la precisione, build.conf
contiene alcune opzioni e variabili per la compilazione e i percorsi delle librerie da utilizzare (oppure le corrispondenti opzioni di compilazione). In questo file la variabile QTI_ROOT
è uguale al percorso della cartella principale del codice sorgente di QtiPlot. Ho modificato build.conf.example
in base ai reali percorsi delle librerie utilizzate ed ecco il mio build.conf
:isEmpty( QTI_ROOT ) { message( "each file including this config needs to set QTI_ROOT to the dir containing this file!" ) } ########################################################## ## System specific configuration ########################################################## # Global include path which is always added at the end of the INCLUDEPATH SYS_INCLUDEPATH = /opt/local/include # Global lib path and libs which is ls always added at the end of LIBS SYS_LIBS = -L/opt/local/lib ########################################################## ## zlib (http://www.zlib.net/) ########################################################## # include path. leave it blank to use SYS_INCLUDE ZLIB_INCLUDEPATH = $$QTI_ROOT/3rdparty/zlib/ ########################################################## ## muParser (http://muparser.sourceforge.net/) ########################################################## # include path. leave it blank to use SYS_INCLUDE MUPARSER_INCLUDEPATH = /usr/include/muParser/ # link statically against a copy in 3rdparty/ MUPARSER_LIBS = /usr/lib/libmuparser.so # or dynamically against a system-wide installation # MUPARSER_LIBS = -lmuparser ########################################################## ## GNU Sientific Library (http://www.gnu.org/software/gsl/) ########################################################## # include path. leave it blank to use SYS_INCLUDE # GSL_INCLUDEPATH = $$QTI_ROOT/3rdparty/gsl/include # link statically against a copy in 3rdparty/ # GSL_LIBS = $$QTI_ROOT/3rdparty/gsl/lib/libgsl.a \ # $$QTI_ROOT/3rdparty/gsl/lib/libgslcblas.a # or dynamically against a system-wide installation GSL_LIBS = -lgsl -lgslcblas ########################################################## ## QWT - use local copy till upstream catches up # http://qwt.sourceforge.net/index.html ########################################################## # include path. QWT_INCLUDEPATH = $$QTI_ROOT/3rdparty/qwt/src # link locally against a copy in 3rdparty/ QWT_LIBS = $$QTI_ROOT/3rdparty/qwt/lib/libqwt.a ########################################################## ## QwtPlot3D - use local copy till upstream catches up # http://qwtplot3d.sourceforge.net/ ########################################################## # include path. QWT3D_INCLUDEPATH = $$QTI_ROOT/3rdparty/qwtplot3d/include # link locally against a copy in 3rdparty/ win32:QWT3D_LIBS = $$QTI_ROOT/3rdparty/qwtplot3d/lib/qwtplot3d.dll unix:QWT3D_LIBS = $$QTI_ROOT/3rdparty/qwtplot3d/lib/libqwtplot3d.a ########################################################## ## libpng - optional. you don't have to set these variables ########################################################## # include path. leave it blank to use SYS_INCLUDE # LIBPNG_INCLUDEPATH = $$QTI_ROOT/3rdparty/libpng/ # link statically against a copy in 3rdparty/ # LIBPNG_LIBS = $$QTI_ROOT/3rdparty/libpng/libpng.a # or dynamically against a system-wide installation LIBPNG_LIBS = -lpng ########################################################## ## QTeXEngine - optional. you don't have to set these variables # http://soft.proindependent.com/qtexengine/ ########################################################## # include path. TEX_ENGINE_INCLUDEPATH = $$QTI_ROOT/3rdparty/QTeXEngine/src # link locally against a copy in 3rdparty/ TEX_ENGINE_LIBS = $$QTI_ROOT/3rdparty/QTeXEngine/libQTeXEngine.a ########################################################## ## ALGLIB (2.6) - optional. you don't have to set these variables # http://www.alglib.net/ ########################################################## # include path. ALGLIB_INCLUDEPATH = $$QTI_ROOT/3rdparty/alglib/src # link locally against a copy in 3rdparty/ ALGLIB_LIBS = $$QTI_ROOT/3rdparty/alglib/out/libalglib.a ########################################################## ## TAMUANOVA - optional. you don't have to set these variables # http://www.stat.tamu.edu/~aredd/tamuanova/ ########################################################## # include path. TAMUANOVA_INCLUDEPATH = $$QTI_ROOT/3rdparty/tamu_anova/ # link locally against a copy in 3rdparty/ TAMUANOVA_LIBS = $$QTI_ROOT/3rdparty/tamu_anova/libtamuanova.a ########################################################## ## python - only used if python is needed ########################################################## # the python interpreter to use # (unix only, windows will use what ever is configured to execute .py files!) PYTHON = python ########################################################## ## Qt tools - allows to use specific versions ########################################################## LUPDATE = lupdate LRELEASE = lrelease ############################################################ ## Target specific configuration: configure Qtiplot itself ############################################################ contains( TARGET, qtiplot ) { # building without muParser doesn't work yet SCRIPTING_LANGS += muParser SCRIPTING_LANGS += Python # a console displaying output of scripts; particularly useful on Windows # where running QtiPlot from a terminal is inconvenient DEFINES += SCRIPTING_CONSOLE #DEFINES += QTIPLOT_DEMO # Uncomment the following line if you want to perform a custom installation using the *.path variables defined in ./qtiplot.pro. #CONFIG += CustomInstall # Uncomment the following line if you want to build QtiPlot as a browser plugin (not working on Internet Explorer). #CONFIG += BrowserPlugin CONFIG += release #CONFIG += debug # Uncomment the following line if you want to link statically against Qt. #CONFIG += StaticBuild #win32: CONFIG += console }
Non abbiamo ancora finito, dobbiamo fare un'ultima cosa. Modifichiamo il file
qtiplot.pro
che si trova nella cartella principale del codice sorgente. Questo contiene il nome di quali cartelle contengono del codice che dovrà essere compilato. Togliamo dall'elenco fitPlugins
e manual
(eventualmente potranno essere compilati successivamente), quindi il file apparirà più o meno così:TEMPLATE = subdirs SUBDIRS = 3rdparty/qwt \ 3rdparty/qwtplot3d \ qtiplotA questo punto dovremmo essere in grado, finalmente di compilare QtiPlot. Come spiegato nel file
README.html
i comandi da dare sonoqmake makePer rendere più veloce la compilazione, chi ha un processore multicore può passare a
make
l'opzione -j n
, dove n
è il numero di core del processore (o meglio di job simultanei che può gestire, però per semplificare il discorso parliamo di core). Quindi chi, per esempio, ha un processore con quattro core potrà usare per compilare QtiPlot il comandomake -j 4Se la compilazione va a buon fine (come al solito possiamo controllarlo con
echo $?
) possiamo direttamente avviare QtiPlot, per vedere se funziona, inserendo il percorso relativo dell'eseguibile appena generato:qtiplot/qtiplotInfine si può, se lo si desidera, installare il programma con
sudo make installoppure utilizzando
checkinstall
:sudo checkinstallche crea un semplice pacchetto .deb (il risultato, però, non è "professionale").
Thank you for the post.
RispondiEliminaI have a problem compiling qtiplot.
Here is the Error I get:
cd qtiplot/ && make -f Makefile
make[1]: Entering directory `/home/casper/QtiPlot/qtiplot-0.9.8.4/qtiplot'
g++ -c -pipe -O2 -D_REENTRANT -Wall -W -DSCRIPTING_CONSOLE -DSVN_REVISION="\"\"" -DQT_PLUGIN -DSCRIPTING_MUPARSER -DSCRIPTING_PYTHON -DGL2PS_HAVE_LIBPNG -DTEX_OUTPUT -DHAVE_TAMUANOVA -DQT_NO_DEBUG -DQT_SVG_LIB -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_XML_LIB -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4/QtXml -I/usr/include/qt4/Qt3Support -I/usr/include/qt4/QtSvg -I/usr/include/qt4 -I/usr/include/qt4/QtAssistantClient -I/usr/include/qt4/QtAssistant -I../3rdparty/zlib -I/usr/include/muParser -I../3rdparty/qwt/src -I../3rdparty/qwtplot3d/include -Iicons -Isrc/analysis -Isrc/analysis/dialogs -Isrc/core -Isrc/excel -Isrc/lib/include -Isrc/lib/3rdparty/qtcolorpicker/src -Isrc/plot2D -Isrc/plot2D/dialogs -Isrc/plot3D -Isrc/matrix -Isrc/table -Isrc/scripting -I/usr/include/python2.6 -I../3rdparty/QTeXEngine/src -I../3rdparty/tamu_anova/ -I/opt/local/include -I/usr/X11R6/include -I/home/casper/QtiPlot/qtiplot-0.9.8.4/tmp/qtiplot -o ../tmp/qtiplot/sipqtiAnova.o ../tmp/qtiplot/sipqtiAnova.cpp
In file included from src/scripting/qti.sip:3396:
src/analysis/Anova.h:33: fatal error: tamu_anova.h: No such file or directory
compilation terminated.
make[1]: *** [../tmp/qtiplot/sipqtiAnova.o] Error 1
make[1]: Leaving directory `/home/casper/QtiPlot/qtiplot-0.9.8.4/qtiplot'
Any ideas?
Check in your build.conf that the variables TAMUANOVA_INCLUDEPATH and TAMUANOVA_LIBS are well defined, ie the paths are correct. It seems that g++ can't find tamu_anova.h in qtiplot-0.9.8.4/3rdparty/tamu_anova/, maybe because it isn't the right path.
RispondiEliminaBye bye
Thanks for reply, elrond
RispondiEliminaThe path is right, and the file is there. ?
Are you sure that path is `qtiplot-0.9.8.4/qtiplot/3rdparty/tamu_anova/' instead of `qtiplot-0.9.8.4/qtiplot/3rdparty/tamu_anova-0.2/'? When extracting with `tar' TAMUANOVA package the latter is the default path.
RispondiEliminaYou can check whith this command:
$ ls -l /home/casper/QtiPlot/qtiplot-0.9.8.4/qtiplot/3rdparty
I have found the reason for that error "-", instead of "_". But now I have another one, could you, please, look what's wrong:
RispondiElimina../tmp/qtiplot/ApplicationWindow.o: In function `ApplicationWindow::showMatrixResamplingDialog(bool)':
ApplicationWindow.cpp:(.text+0x630f): undefined reference to `MatrixResamplingDialog::MatrixResamplingDialog(Matrix*, bool, QWidget*, QFlags)'
../tmp/qtiplot/ApplicationWindow.o: In function `ApplicationWindow::convertTableToMatrixRandomXYZ()':
ApplicationWindow.cpp:(.text+0x32051): undefined reference to `GriddingDialog::GriddingDialog(Table*, QString const&, int, QWidget*, QFlags)'
../tmp/qtiplot/MatrixModel.o: In function `MatrixModel::resample(int, int, int)':
MatrixModel.cpp:(.text+0x19a3): undefined reference to `ap::amalloc(unsigned int, unsigned int)'
MatrixModel.cpp:(.text+0x19df): undefined reference to `ap::afree(void*)'
MatrixModel.cpp:(.text+0x1a39): undefined reference to `ap::amalloc(unsigned int, unsigned int)'
MatrixModel.cpp:(.text+0x1b36): undefined reference to `spline2dresamplebilinear(ap::template_2d_array const&, int, int, ap::template_2d_array&, int, int)'
MatrixModel.cpp:(.text+0x1bfa): undefined reference to `ap::afree(void*)'
MatrixModel.cpp:(.text+0x1c09): undefined reference to `ap::afree(void*)'
MatrixModel.cpp:(.text+0x1c42): undefined reference to `spline2dresamplebicubic(ap::template_2d_array const&, int, int, ap::template_2d_array&, int, int)'
MatrixModel.cpp:(.text+0x1c63): undefined reference to `ap::afree(void*)'
MatrixModel.cpp:(.text+0x1c7c): undefined reference to `ap::afree(void*)'
../tmp/qtiplot/MyParser.o: In function `MyParser::MyParser()':
MyParser.cpp:(.text+0x1002): undefined reference to `mu::ParserCallback::ParserCallback(double (*)(double, double), bool)'
../tmp/qtiplot/MyParser.o: In function `MyParser::MyParser()':
MyParser.cpp:(.text+0x1c82): undefined reference to `mu::ParserCallback::ParserCallback(double (*)(double, double), bool)'
../tmp/qtiplot/muParserScript.o: In function `muParserScript::muParserScript(ScriptingEnv*, QString const&, QObject*, QString const&)':
muParserScript.cpp:(.text+0x1088): undefined reference to `mu::ParserCallback::ParserCallback(double (*)(double, double), bool)'
muParserScript.cpp:(.text+0x14c8): undefined reference to `mu::ParserCallback::ParserCallback(double (*)(double, double), bool)'
../tmp/qtiplot/muParserScript.o: In function `muParserScript::muParserScript(ScriptingEnv*, QString const&, QObject*, QString const&)':
muParserScript.cpp:(.text+0x1b78): undefined reference to `mu::ParserCallback::ParserCallback(double (*)(double, double), bool)'
../tmp/qtiplot/muParserScript.o:muParserScript.cpp:(.text+0x1fb8): more undefined references to `mu::ParserCallback::ParserCallback(double (*)(double, double), bool)' follow
collect2: ld returned 1 exit status
make[1]: *** [qtiplot] Error 1
make[1]: Leaving directory `/home/casper/QtiPlot/qtiplot-0.9.8.4/qtiplot'
From where did you download QtiPlot source? In my one I can't fine reference to `MatrixResamplingDialog::MatrixResamplingDialog(Matrix*, bool, QWidget*, QFlags)', nor `GriddingDialog::GriddingDialog(Table*, QString const&, int, QWidget*, QFlags)' (in both I have `Qt::WFlags' instead of `QFlags'), nor `ap::amalloc(unsigned int, unsigned int)' and so on.
RispondiEliminaApprofitto del tuo spazio per aggiungere all'ottimo post che ho tradotto in italiano sia QtiPlot che il suo manuale. Se qualcuno di buona volontà e esperto di statistica intende inquisire entrambe le traduzioni e segnalare gli errori fa cosa gradita. Per qualche giorno si consiglia di utilizzare il file .html in quanto il .pdf necessita di una revisione. La traduzione di qtiplot_it.qm per la versione 0.9.8.4 è in preparazione.
RispondiEliminaGrazie per l'ospitalità.
renatoriv
@renatoriv: intanto grazie per il prezioso contributo che hai dato a questo programma. Spero che un'interfaccia in italiano e un manuale tradotto aiutino nuovi utenti ad avvicinarsi a questo software.
RispondiEliminaHo messo in evidenza in cima al post il tuo appello, spero di aver fatto cosa gradita :-) Una domanda: in che modo che è interessato ad aiutarti può contattarti?
Ciao.
@renatoriv: scusa se ho cancellato il tuo commento, l'ho fatto solo per evitarti un po' di spam. Ho messo il tuo indirizzo un po' camuffato nella nota iniziale del post. spero di averti fatto un favore :-)
RispondiEliminaCiao
Buona idea. Grazie mille
RispondiEliminarenatoriv