[C con Clase] problema con log(x)

Pau Marc Munoz Torres paumarc en gmail.com
Lun Oct 11 10:05:23 CEST 2010


Grácias por la explicación

pau

2010/10/11 Manuel L. <notret en gmx.es>

>
> 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
>



-- 
Pau Marc Muñoz Torres

Laboratori de Biologia Computacional
Institut de  Biotecnologia   i Biomedicina Vicent Villar

Universitat Autonoma de Barcelona
E-08193 Bellaterra (Barcelona)

telèfon:  (+34)935 86 89 39
Email : paumarc.munoz en bioinf.uab.cat
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20101011/04534aa0/attachment.html>


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