Thursday, 11. June 2009, 01:48:14
Como en el
post anterior sobre php, ahora me surgió una duda con C, en realidad el compilador gcc. Es simple, igual que la vez anterior:
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
double a = sqrt(4.0);
printf("%.2f\n", a);
return ;
}
éste código compila sin ningún problema:
~$ make hola
~$#o bien puedo hacerlo con la forma larga
~$ gcc -o hola hola.c -Wall
~$
Nada pasa, ahora compliquemos un poco:
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
double b = 4.0;
double a = sqrt(b);
printf("%.2f\n", a);
return ;
}
Ahí está el problema, ¿se ve?, lo único que hice fue cambiar la llamada de sqrt, en lugar de llamarla con un valor constante lo llamo con una variable, aquí la salida del compilador:
~$ make hola
cc hola.c -o hola
/tmp/ccMlaYKP.o: In function `main':
hola.c:(.text+0x3b): undefined reference to `sqrt'
collect2: ld devolvió el estado de salida 1
make: *** [hola] Error 1
~$ #nada cambia cuando lo hago con la versión larga:
~$ gcc -o hola -Wall hola.c
/tmp/ccMlaYKP.o: In function `main':
hola.c:(.text+0x3b): undefined reference to `sqrt'
collect2: ld devolvió el estado de salida 1
make: *** [hola] Error 1
me marca como que sqrt no está definida, buscando buscando encontré la solución
aquí, pero antes tengo que decir que ésto no sucede si utilizo g++ para compilar, o sea si compilo el código con compilador de C++,
~$ g++ -o hola -Wall hola.c
~$
anda hermoso, en fin, la solución que encontré es que hay que decirle explícitamente que linkee con la librería math, eso se hace pasándole el parámetro -lm al linker, por lo que el código para compilar algo que utilice la librería math.h quedaría así:
~$ gcc -o hola -Wall hola.c -lm
Pero mi duda es ¿por qué el compilador de C++ no necesita el pasaje de ese parámetro mientras que C si, y lo que es peor aún, por qué si le paso una constante compila sin problemas?