Un semplice procedimento per creare un file DLL e utilizzarlo in un programma in C.
Qualche tempo fa, mi sono interessato all’argomento “file DLL” (dynamic-link library ossia “libreria a collegamento dinamico”); come costruire una DLL e come utilizzarla all’interno di un sorgente C. Visitando vari forum e tutorial su internet, ho raccolto alcune preziose informazioni e ho raggiunto l’obiettivo. Tuttavia, vedendo la presenza di #include, file .h, extern, DLLimport… mi è venuta una gran voglia di… SEMPLIFICARE, SEMPLIFICARE e ancora SEMPLIFICARE il più possibile. Mi sono chiesto, molto semplicemente, “Serve davvero tutta questa roba!?“. Dopo aver lavorato sono arrivato a definire il semplice esempio, che vi mostro in questo articolo; nessun #include, nessuna extern, DLLimport non se ne parla, ma andiamo al sodo.
Descrizione dell’esempio – creazione del file dll “aMultb.dll” e suo utilizzo.
Per prima cosa ho creato una cartella di lavoro dal nome “crea-dll-utilizza-dll” che contiene soltanto 4 files. I files contenuti sono:
- aMultb.c – sorgente C che contiene la funzione int aMultb(int,int). Questo file diventerà la DLL aMultb.dll. La funzione suddetta esegue la moltiplicazione di due numeri interi e restituisce un risultato intero.
- moltiplico.c – Il sorgente C che utilizza la DLL aMultb.dll
- info-dll.txt – file di testo che contiene le istruzioni operative per fare la DLL e utilizzarla.
- qui.bat – un file batch che contiene il comando “cmd”. Serve per aprire la cartella di lavoro nella console, con un doppio click.
Riporterò ora i sorgenti C e poi le semplici istruzioni operative.
I sorgenti C – aMultb.c e moltiplico.c
Sorgente del file “aMultb.c”
int aMultb(int a, int b){
return a*b;
}
Il file contiene la definizione della funzione int aMultb(int,int) che moltiplica 2 interi e restituisce un risultato intero.
Sorgente del file “moltiplico.c”
#include <stdio.h>
int aMultb(int,int);
int risultato;
int main() {
risultato = aMultb(7,3);
printf("%d",risultato);
}
Il file esegue la funzione aMultb(7,3) ( Risultato 21 ) e stampa a monitor il risultato. In questo file, viene fornito soltanto il prototipo int aMultb(int,int) della funzione aMultb.
Infine pubblico la procedura operativa contenuta nel file “info-dll.txt”. Pochi, chiari passaggi per ottenere un eseguibile che necessita della DLL “aMultb.dll” oppure per un eseguibile che non necessita di nulla per funzionare.
Ecco il contenuto del file “info-dll.txt”; le istruzioni operative.
1) gcc -c aMultb.c ------------> genera il file oggetto, "aMultb.o"
2) gcc -static-libgcc -shared aMultb.o -o aMultb.dll --> genera il file "aMultb.dll"
3) gcc -c moltiplico.c --------> genera il file oggetto, "moltiplico.o"
A questo punto ho generato i files "aMultb.o", "aMultb.dll" e "moltiplico.o". Ho due possibilità, la (4) per generare l'eseguibile che necessita della DLL e la (4 bis) per creare l'eseguibile che non necessita di nulla.
4) gcc moltiplico.o aMultb.dll -o moltiplico-con-dll.exe ----> genero l'eseguibile, "moltiplico-con-dll.exe" (non funziona se manca la DLL, "aMultb.dll")
4 bis) gcc moltiplico.o aMultb.o -o moltiplico-senza-dll.exe --> genero l'eseguibile, "moltiplico-senza-dll.exe" (funziona anche da solo...).
Pubblico infine un’immagine (cattura di una schermata) che mostra tutti i comandi e le prove pratiche. Dall’immagine si vede che l’eseguibile “moltiplico-senza-dll.exe” funziona correttamente sia prima che dopo aver cancellato la dll, mentre l’eseguibile “moltiplico-con-dll.exe” funziona bene soltanto quando è presente la dll “aMultb.dll”; senza di essa non funziona più, e compare un box di errore.
Per ora è tutto. Arrivederci al prossimo articolo.
Andrea Paolini (Amministratore del Blog).