QT Creator e configurazione di librerie esterne

Chi utilizza l'IDE QT Creator per lo sviluppo di applicazioni in C++, può essere stato messo in difficoltà nel configurare il tool per l'utilizzo di librerie esterne. In questo breve articolo mostreremo come fare utilizzando una bella libreria "musicale" irrKlang.
Per prima cosa scaricate la libreria dal sito http://www.ambiera.com/irrklang/downloads.html. Scaricherete un file zip che scompatterete all'interno di una cartella irrKlang, trovandovi con la seguente struttura:

Struttura cartelle pacchetto irrKlangCreate da qualche parte nel vostro file system la cartella CppLibs (o comunque vogliate chiamarla); nel seguito supporremo che abbiate creato la cartella C:\CppLibs. Copiate all'interno di essa la cartella irrKlang  che avete scompattato poco innanzi. In pratica, lo scopo della CppLibs è quello di contenere tutte le librerie esterne che utilizzate per i vostri progetti, suddivise per prodotto (ad esempio: libreria irrKlang, librerie per la connessione al database mySQL++, etc..). Facciamo notare che non è necessario copiare tutte le cartelle del file zip originale, ma basterebbero le cartelle "include" e "libs"; in ogni caso è buona norma mantenere tutto ciò che si riferisce ad una libreria in un unico posto, per averlo sempre a portata di mano.

A questo punto, create in C:\CppLibs la cartella "bin" (o comunque vogliate chiamarla) e inseritela nella variabile PATH di sistema - per Linux nella variabile LD_LIBRARY_PATH -  (operazione che supponiamo sappiate fare per il vostro sistema operativo). All'interno di tale cartella, copiate le librerie che trovate nella cartella bin della directory irrKlang, per il vostro sistema operativo e per il vostro compilatore: i file con estensione ".dll" se siete su sistema Windows o quelle con estensione ".so" se siete in sistema operativo Linux (su http://www.learncpp.com/cpp-tutorial/a1-static-and-dynamic-libraries/ trovate una ottima spiegazione relativa alle tipologia di librerie C++). Nel mio caso, ad esempio, utilizzo il compilatore gcc in ambiente Windows, quindi ho copiato i file:  ikpFlac.dll, ikpMP3.dll e irrKlang.dll dalla cartella C:\CppLibs\irrKlang\bin\win32-gcc in C:\CppLibs\bin. In definitiva, la struttura finale appare come segue:

Struttura finale cartelle CppLibs

Aprite QT Creator, create un nuovo progetto con il nome irrKlang (ma potete anche qui scegliere il nome che preferite) ed aprite il file irrKlang.pro, trovandoci quanto segue:

 FilePRO

Copiate all'interno del file le seguenti righe:

INCLUDEPATH += C:/CppLibs/irrKlang/include/
DEPENDPATH += C:/CppLibs/irrKlang/include/
LIBS += -L C:/CppLibs/irrKlang/lib/Win32-gcc/ -l irrKlang

Ottenendo quanto mostrato nella figura che segue:

File .pro modificato

Si noti che irrKlang che segue il parametro -l nella stringa a destra della LIBS è il nome della libreria contenuto nella cartella C:\CppLibs\irrKlang\lib\Win32-gcc senza l'estensione e senza la parte lib del nome del file. Mi spiego meglio: se guardiamo nella cartella C:\CppLibs\irrKlang\lib\Win32-gcc troviamo il file libirrKlang.a che è la libreria statica (ha estensione .a) che dobbiamo includere. Per includerla abbiamo utilizzato il parametro LIBS += -L C:/CppLibs/irrKlang/lib/Win32-gcc/ -l irrKlang in cui -L (l maiuscola) fa riferimento alla cartella in cui si trova la libreria, mentre -l (l minuscola) fa riferimento al nome della libreria, che non coincide con il nome del file, ma si "ricava" dal nome del file togliendo "lib" all'inizio e togliendo l'estensione (.a). Questo è coerente con le regole del compilatore gcc che potete leggere su http://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Link-Options.html#index-l-858.  

Per testare che tutto funzioni potete utilizzare il programma che trovate nella cartella irrKlang\examples\01.HelloWorld nel file main.cpp, oppure utilizzare l'HelloWorld semplificato (e scopiazzato dall'HelloWorld originale) che ho inserito qui di seguito. Fate attenzione di inserire un percorso valido per il  file getout.ogg  alla riga 18 del listato

#include <stdio.h>
#include <irrKlang.h>
#include <conio.h>
using namespace irrklang;
using namespace std;
int main()
{
    // start the sound engine with default parameters
    ISoundEngine* engine = createIrrKlangDevice();
    if (!engine)
    {
        printf("Could not startup engine\n");
        return 0; // error starting up the engine
    }
    // To play a sound, we only to call play2D(). The second parameter
    // tells the engine to play it looped.
    // play some sound stream, looped
    engine->play2D("C:/CppLibs/irrKlang/media/getout.ogg", true);
    // In a loop, wait until user presses 'q' to exit
    do
    {
        printf("Press a press 'q' to quit.\n");
    }
    while(getch() != 'q');
    engine->drop(); // delete engine
    return 0;
}

Quanto sopra riportato vale in generale per qualunque componente esterno. In sintesi, occorre ricordarsi di:

  1. Definire il percorso alla cartella di include del componente che si sta utilizzando tramite le variabili INCLUDEPATH  e DEPENDPATH
  2. Definire il percorso alla cartella della libreria del componente che si sta utilizzando tramite la variabile LIBS
  3. Inserire le librerie (che in genere si trovano in una qualche directory "bin" del pacchetto utilizzato per distribuire il componente) in una directory del file system, che deve essere registrata nella variabile PATH (o LD_LIBRARY_PATH per Linux). Ricordiamo infatti che il sistema operativo va a cercare la libreria esterna prima nella stessa cartella in cui si trova l'eseguibile del programma che sta girando quindi in una serie di cartelle tra le quali quelle che trova registrate nella variabile PATH (o LD_LIBRARY_PATH per Linux). Per aprofondimenti si veda ad esempio http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx oppure http://msdn.microsoft.com/en-us/library/7d83bc18%28v=vs.80%29.aspx oppure ancora http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.

La comodità di inserire le librerie in una unica cartella bin per tutti i componenti che si utilizzano quando si sta sviluppando un progetto, consiste nel fatto che, quando si deve preparare il pacchetto di installazione - ad esempio con uno dei tanti installer in commercio  - c'è un unico punto, la cartella bin, in cui si trovano tutte le librerie che dovranno essere incluse nel pacchetto finale.

Le descrizioni dei vari parametri che possono essere utilizzati per configurare il progetto inserendoli nel file .pro di QT Creator, sono disponibili su http://pepper.troll.no/s60prereleases/doc/qmake-variable-reference.html Tra i tanti, ricordiamo ad esempio il parametro QMAKE_CXXFLAGS che serve per passare parametri al compilatore. Ad esempio: QMAKE_CXXFLAGS += -static indica al compiltore gcc che si vuole compilare in modalità statica.

Siete ancora qui ? Pensavo steste ascoltando un po' di musica...

 

Aggiungi commento


Codice di sicurezza
Aggiorna

Copyright © 2017 Berta Danilo. Tutti i diritti riservati.
Joomla! è un software libero rilasciato sotto licenza GNU/GPL.