Indice

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:

$ gcc -Wall -pedantic -c vect.c
$ 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 :

$ 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).

Esercizio 2: makefile

Utilizzando l'esempio visto a lezione definire un makefile che contenga almeno i target per ricreare automaticamente la libreria e per generare l'eseguibile di test per la libreria dell'esercizio 1.

Esercizio 3: Preprocessing, compilazione e linking

1) Compilare ed eseguire il seguente programma:

#include <stdio.h>
#include <math.h>
 
int main (void) {
  double x=3.0;
 
  printf("Radice = %f\n",sqrt(x));
  return 0;
}

salvato nel file ff.c con

gcc -Wall -pedantic ff.c

Su alcune macchine (Es linux) questo comando segnala un errore. Cosa e' successo ? Come si risolve il problema?

2) Cosa accade se eliminiamo la linea

#include <math.h>

? A questo punto cosa va storto? Sapete interpretare i messaggi a video e stabilire chi li ha scritti e perche'? Viene generato l'eseguibile?

3) Usare l'opzione -E del gcc: che cosa succede?

4) Usare l'opzione -S del gcc. Viene generato un file di testo ff.S. Cosa contiene ?