Ott 132010
 

In questo nuovo articolo tratteremo la creazione di una DLL sotto windows con il nostro amato CodeBlocks. Se seguite questo breve tutorial scoprirete che la cosa è tutt’altro che complessa, quasi banale, nonostante a mio tempo ho fatto non poca fatica a comprendere questi semplici passi. Credo che chi è giunto in questo articolo già conosce la definizione di DLL (Dynamic Link Library): sono librerie, ossia insiemi di funzioni, raggruppate sotto un unico file, che vengono caricate dall’eseguibile principale a seconda delle necessità. Possono essere delle librerie fondamentali per il funzionamento del software ed in questo caso sono obbligtoriamente caricate allesecuzione del software stesso, oppure contengono dei “moduli” aggiuntivi che vengono caricati solo all’occorrenza. Il vantaggio delle DLL è che possono essere sostituite senza cambiare una sola linea di codice del progetto principale. In questo modo possiamo ad esempio sostituire una vecchia versione con una più ottimizzata, o possiamo scegliere se mettere una libreria ottimizzata per un processore piuttosto che per un’altro, o con algoritmi non ottimizzati piuttosto che mmx, etc. Inoltre le dll possono essere usate da più software permettendo di avere più progetti che condividono la stessa parte di codice con conseguente risparmi di memoria e possibilità di aggiornare multipli progetti in contemporanea con la semplice sostituzione delle DLL.

Sperando di essere stato sufficientemente chiaro, passiamo alle cose più pratiche. In Codeblocks abbiamo già pronto il tipo di progetto “Shared Library”. Ci chiederà solamente se usare il C o il C++. Rispondiamo C++ e selezioniamo il nome e percorso del progetto ed il gioco è fatto.

Andiamo nel file main.cpp che è creato in automatico e lo sostituiamo con il seguente codice:

#include "main.h"

int SampleAddInt(int i1, int i2) {return i1 + i2;}
void SampleFunction1() { return; }
int SampleFunction2() { return(1);}

Vi faccio notare che ci sono solo tre funzioni ed estremamente banali, la prima che somma due interi, la seconda che ritorna dalla funzione e basta e la terza che ritorna sempre il valore 1. La semplificazione è voluta al fine di rendere ben visibile il funzionamento della dll senza complicarci la vita con funzioni poco comprensibili che riempiono pagine di codice senza aggiungere nulla ai concetti che andiamo a guardare oggi.

A questo punto creiamo il corrispondente file.h (vedi il video) ed inseriamo il seguente codice:

#ifndef __SS_LIBRARY_DLL_H__
#define __SS_LIBRARY_DLL_H__

#define DLL_EXPORT __declspec(dllexport)
#ifdef __cplusplus
extern "C"
{
#endif
// qui cominciano I prototipi delle funzioni
int  DLL_EXPORT SampleAddInt(int, int);
void DLL_EXPORT SampleFunction1();
int DLL_EXPORT SampleFunction2();
#ifdef __cplusplus
}
#endif
#endif

Ora andiamo a compilare e se tutto và per il verso giusto della direcory di destinazione avrete il file .dll e quello .dll.a. Ecco il video delle sequenze appena viste, così i passaggi saranno sirucamente più chiari.


Ora che la nostra dll è pronta non dobbiamo fare altro che utilizzarla nel nostro progetto. Se non ne abbiamo già uno pronto in cui vogliamo sfruttare la nuova DLL, creiamone uno nuovo. I passi da fare sono molto semplici, dobbiamo infatti includere il file .h della dll in modo che il nostro progetto venga a conoscenza di come utilizzare le funzioni, e poi dobbiamo indicare al linker la dll.a creata prima in modo che riesca a creare un eseguibile corretto. Ho preparato qui sotto un secondo video con tutti i passi. Questa volta non mi sono preparato in anticipo in modo da creare il “video perfetto”, ma ho volutamente lasciato delle situazioni con tipici errori che tutti noi facciamo sempre e che normalmente riusciamo a correggere in pochi secondi ma che talora, specie per chi è alle prime armi, possono essere insormontabili.

Più in dettaglio, il nuovo progetto ed il progetto con la dll sono in directory separate. Ciò implica in primo luogo che il file .h da includere deve essere  corredato di tutto il path, che può anche essere relativo come nell’esempio. Ne deriva l’importanza di un’ottimale stutturazione dei nostri files nel contesto dei vari progetti. In secondo luogo dopo la compilazione avvenuta correttamente l’eseguibile non funziona proprio perchè non trova la dll. Questa deve infatti risiedere o in una directory di systema come system32 o comunque nelle directory raggiunte dal path o, come mostrato nell’esempio, direttamente nella diectoy in cui risiede l’eseguibile. In quest’ultimo modo è anche possibile, ed auspicabile, creare la versione di debug del progetto che funzioni con la versione di debug della dll e dall’altra avere il progetto release che funziona con la dll release.

Un’ultimo appunto sul codice che è banale, in particolare viene usata la funzione SampleAddInt della DLL per ffettuare la somma di due interi. Il risultato è posto nella casella di testo creata da noi.

Ecco il video, spero che tutti i passi siano chiari e che vi sia stato di aiuto.

  No Responses to “CodeBlocks: creiamo una DLL sotto Windows”