[C con Clase] problema con log(x)

Jorge García jorgeantonio49 en gmail.com
Lun Oct 11 19:53:35 CEST 2010


Gracias Pau.
Hasta yo aprendí, con tu explicación tan completa.
Saludos
El lun, 11-10-2010 a las 09:49 +0200, Manuel L. escribió:
> Hola, Pau:
> 
> Para compilar algo se necesita ese algo. No podría obtener un ejecutable a partir de su código si el compilador previamente no supiese de la existencia de math.c. De ahí que deba indicarle dónde se encuentra cada archivo que contiene código (ya sea C o un "semielaborado") para que gcc pueda hacer con eso un programa. Sin embargo, por lo común en su uso, el código fuente de las librerías estándar ya viene compilado y con el compilador o el SO. Así, si usa código incluído en la cabecera stdio.h el compilador (el preprocesador para ser exactos) busca en sus carpetas que contienen código, la encuentra e incluye por usted en la lista de ficheros a tratar el fichero que contenga el código de la cabecera.
> 
> ¿Por qué con ln no hace lo mismo que con printf? El código descrito en math.h está compilado en una librería dinámica de nombre libm, y no libmath. El compialdor gcc no encuentra la librería y entonces debe especificársela manualmente, igual que no sabe que en math.c hay código que debe procesar. Como es una librería dinámica, en gcc debe usar la opción -llibreria, y por convención primero mira archivos cuyo nombre comience por liblibreria...
> 
> ¿Por qué con log(5) sí compila? El compilador, para hacer el programa, va transformando el código C a un programa en código fuente. ¿Qué debe hacer con el caracter 5? Que en la zona de datos del programa haya espacio para almacenar el entero cinco. Ud. no ha declarado una variable, pero el compilador lo hará (implícitamente, claro). Y no sólo eso, si escribiese ln(3 * 5) el compilador dejaría espacio en la zona de datos para almacenar el entero 15. Así, la multiplicación no se hará en tiempo de ejecución. Y... también calcula ln(3 * 5). ¿Sin el código de log? ¡Imposible! Pero sucede que el optimizador tiene algunas reglas entre las que se encuentra el simplificar log(<constante>) usando la función log, que conoce. Puede comprobar que el ejecutable no contiene ninguna referencia a la librería libm en ese caso.
> 
> ¿Por qué con g++ sí compila? Pues porque en este caso sí incluye automáticamente el código necesario, ya que log se encuentra en la librería cmath de la librería estándar para C++, que sí tiene el mismo nombre que su cabecera. Puede comprobar que el ejecutable tiene una referencia a libm.
> 
> Atentamente, Manuel L.
> 
> El pasado 2010-10-10 12:01:37, Pau escribió:
>  
> P> hola
> P>  Estoy copiando este script
> P> #include <stdio.h>
> P> #include <math.h>
> P> int main ()
> P> {
> P>   double param, result;
> P>   param = 5.5;
> P>   result = log (param);
> P>   printf ("ln(%lf) = %lf\n", param, result );
> P>   return 0;
> P> }
> P> y cuando compilo me da el siguinte error
> P> pau en esberro:~/c$ gcc math.c -o math
> P> /tmp/cc5Xydl9.o: In function `main':
> P> math.c:(.text+0x1b): undefined reference to `log'
> P> collect2: ld returned 1 exit status
> P> pau en esberro:~/c$
> P> seguro que tengo las librerias, si pongo log(5) compila bien
> P> alguien sabe que puede estar passando?
> P> _______________________________________________
> P> Lista de correo Cconclase Cconclase en listas.conclase.net
> P> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> P> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

-- 
Jorge Antonio Garcia Galicia
http://www.nemediano.com.mx





Más información sobre la lista de distribución Cconclase