sqrt de math.h causa el error del enlazador “referencia indefinida a sqrt” solo cuando el argumento no es una constante

Creé un pequeño progtwig, de la siguiente manera:

#include  #include  #include  int main(int argc, char *argv[]) { int i; double tmp; double xx; for(i = 1; i <= 30; i++) { xx = (double) i + 0.01; tmp = sqrt(xx); printf("the square root of %0.4f is %0.4f\n", xx,tmp); sleep(1); xx = 0; } return 0; } 

Cuando trato de comstackr esto con el siguiente comando, obtengo un error de comstackción.

 gcc -Wall calc.c -o calc 

devoluciones:

 /tmp/ccavWTUB.o: In function `main': calc.c:(.text+0x4f): undefined reference to `sqrt' collect2: ld returned 1 exit status 

Si reemplazo la variable en la llamada a sqrt (xx) con una constante como sqrt (10.2), se comstack muy bien. O bien, si me enlace explícitamente de la siguiente manera:

 gcc -Wall -lm calc.c -o calc 

También funciona bien. ¿Alguien puede decirme qué está causando esto? He sido progtwigdor de C durante mucho tiempo (y he escrito progtwigs pequeños similares usando math.h) y nunca había visto algo como esto.

Mi versión de gcc sigue:

 $ gcc --version gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ 

Si miras el resultado del comstackdor en el caso en que sqrt(10.2) , apostaré a que ves que una llamada a sqrt() no se realiza realmente.

Esto sucede porque GCC reconoce varias funciones que puede tratar especialmente. Esto le da la capacidad de realizar ciertas optimizaciones, en este caso plegado constante . Tales funciones especiales se denominan Built-ins .

En el caso en que debe vincularse a la biblioteca matemática (porque la está llamando con una variable), debe vincularla explícitamente. Algunos sistemas operativos / comstackdores lo hacen por usted, por lo que es posible que no lo haya notado en el pasado.