/tmp/cctraBp0.o: In function `main':In questo esempio ho compilato un programma molto semplice:
run.c:(.text+0x34): undefined reference to `sqrt'
collect2: ld returned 1 exit status
#include <stdio.h>Qui viene utilizzata una funzione della libreria matematica, sqrt, e viene opportunamente incluso l'header math.h, ma la libreria matematica del C appartiene ad una speciale categoria di librerie, quella delle librerie dinamiche o condivise (shared libraries).
#include <math.h>
int main()
{
double x = 2.0;
printf("Hello (%lf).\n", sqrt(x));
return 0;
}
Quando si usa una di queste librerie non è sufficiente includerla nel codice, si rende necessario utilizzare delle opzioni di compilazione. Per compilare correttamente questo programma senza ottenere errori dal linker (ld), dobbiamo aggiungere l'opzione -lm, in questo modo:
gcc run.c -o run -lmIn questo modo si otterrà un eseguibile perfettamente funzionante senza errori di linking.
ATTENZIONE: quando si usano versioni recenti di gcc (sicuramente dalla versione 4.3.1 in poi) l'utilizzo dell'opzione -lm è necessario soltanto se si utilizzano le funzioni matematiche insieme a variabili. Se invocassimo sqrt con una costante come argomento, il gcc sostituisce l'invocazione della funzione con il suo risultato ed il codice corrispondente alla invocazione della funzione matematica non viene generato. Per questo non c'è bisogno di aggiungere l'opzione del linker che permette il caricamento dinamico della libreria a run-time. Il seguente codice, ad esempio:
#include <stdio.h>può essere compilato correttamente con il seguente comando:
#include <math.h>
int main()
{
printf("Hello (%lf).\n", sqrt(2.0));
return 0;
}
gcc run.c -o run
senza che il linker restituisca alcun errore.
Nessun commento:
Posta un commento