2011-03-24 23 views
15

Duplicar posible:
Why do you have to link the math library in C?¿Por qué tengo que vincular explícitamente con libm?

Cuando escribo un programa que utiliza las funciones de la biblioteca math.h, por qué es que tengo que vincular explícitamente a libm a pesar de que son parte de la biblioteca estándar C? Por ejemplo, cuando quiero usar la función sin() necesito #include <math.h> pero también necesito pasar -lm a GCC. Pero para cualquier otra biblioteca de la biblioteca estándar, no tengo que hacer eso. ¿Por qué la diferencia?

Respuesta

14

En los viejos tiempos, los enlazadores eran lentos y separar el código matemático del resto que no se utilizaba hacía que el proceso de compilación fuera más rápido. La diferencia no es tan buena hoy en día, por lo que puede agregar la opción -lm a la configuración predeterminada del compilador.


Tenga en cuenta que la cabecera <math.h> (o cualquier otra cabecera) no contiene código. Contiene información sobre el código, específicamente cómo para llamar a funciones. El código en sí está en una biblioteca. Es decir, el programa no utiliza la "biblioteca <math.h>" , que utiliza la biblioteca matemática y usa los prototipos declarados en el encabezamiento <math.h>.

2

En realidad, la razón por la que normalmente no es necesario enlazar con libm para la mayoría de las funciones matemáticas es que estos están entre líneas por el compilador. Su programa no podrá enlazar en una plataforma donde este no es el caso.

+0

La mayor parte de 'libm' es imposible de alinear a menos que el límite de su función en línea sea de varios KB o haya habilitado un hack como' -ffast-math' que permita al compilador generar código incorrecto pero rápido. –

+0

Bueno, en x86 seno y coseno se implementan dentro de la FPU y se puede acceder con una sola instrucción, por lo que entrando en línea tiene mucho sentido aquí. Un programa que solo usa 'sin()' no necesitará enlazarse con 'libm' en x86, ocultando así la referencia de biblioteca faltante. –

+0

¿Estás seguro de que la instrucción FPU 'sin' puede implementar directamente' sin() '? Si no me equivoco, primero se necesita un argumento de reducción de argumento no trivial. –

3

Es la misma razón por la que tiene que vincular explícitamente a libpthread en la mayoría de las implementaciones. Cuando se añade algo nuevo y aterrador a la biblioteca estándar, por lo general primero se implementa como una separada complemento biblioteca que anula algunos de los símbolos en la implementación antigua biblioteca estándar con versiones que se ajusten a los nuevos requisitos, además de darle un montón de nuevas interfaces. No me sorprendería que algunas implementaciones históricos tenían versiones separadas de printf en libm para flotar impresión del punto, con una versión "light" en el principal libc carente de punto flotante. Este tipo de implementación se menciona y fomenta en realidad para sistemas pequeños en el documento de justificación ISO C, si no recuerdo mal.

Por supuesto, en el largo plazo, la separación de la biblioteca estándar hacia fuera como esto lleva a muchos más problemas que beneficios. La peor parte es probablemente el aumento del tiempo de carga y el uso de memoria para los programas dinámicos.

Cuestiones relacionadas