====== Esercitazione compilazione separata e librerie ======
===== Esercizio 1: Libreria operazioni su vettori =====
Realizzare una libreria che fornisce alcune operazioni comuni su vettori:
/** stampa a sullo standard output */
void print_v (double* a, int n);
/** calcola c = a + b ; n da il numero di elementi dei tre vettori */
void sum_v (double* a, double* b, double* c, int n);
/** calcola il prodotto vettoriale
a[0]*b[0] + ...... a[n-1]*b[n-1]
e lo restituisce come valore
*/
double innerprod_v (double* a, double* b, int n);
/** calcola il massimo valore e lo restituisce
l'indice del massimo viene scritto nella variabile di indirizzo m_i
*/
double max_v(double* a, int n, int* m_i);
/** calcola il segmento di somma massima (vedi esercitazione del 25/03/2015)
*/
double ssm_v(double* a, int n, int* s_init, int* s_lung);
In C per realizzare una libreria si difinisce un file ''.h'' con i prototipi ed i tipi messi a disposizione dalla libreria e si fornisce il codice pre-compilato in un opportuno file di libreria ''.a''.
Nel nostro caso l'header si chiamera' ''vect.h'' e la libreria si chiamera' ''libVect.a''.
Procedere nel modo seguente:
* Definire un file ''vect.h'' che contiene i prototipi delle funzioni implementate (quelle nel riquadro sopra)
* Definire un file ''vect.c'' che contiene il codice che implementa le funzioni.
* Generare il modulo oggetto ''vect.o'' che contiene il codice precompilato delle funzioni, da inserire nella libreria. Il modulo oggetto puo' essere creato con il comando ''gcc'' come segue
$ gcc -Wall -pedantic -c vect.c
* Creare la libreria con i lcomando ''ar'' come segue
$ ar -r libVect.a vect.o
Quando la creazione e' andata a buon fine per testarla creare un file ''main.c'' che contenga delle chiamate alle funzioni di libreria, ad esempio:
#include "./vect.h"
#define N 3
int main (void) {
double a[N] = {3,4,5}, b[N] = {5, 1,7}, c[N];
sum_v(a,b,c,N);
print_v(c,N);
return 0;
}
notate che :
* il main di test deve includere il file ''vect.h'', questo permette al compilatore di controllare i tipi delle chiamate al codice della libreria
* in fase di compilazione per collegare (linking) il codice del nel file ''main.c'' a quello della libreria bisogna usare le opzioni ''-l'' e ''-L''
$ gcc -Wall -pedantic main.c -lVect -L.
dove l'opzione ''-l'' indica il nome della libreria (non standard) da usare in fase di linking e l'opzione ''-L'' specifica la directory (non standard) dove cercarla (oltre alle directory standard tipo ''/usr/lib'').