gcc: ¿por qué la bandera-lm es necesaria para vincular la biblioteca matemática?
glibc version (2)
Esta pregunta ya tiene una respuesta aquí:
Acabo de descubrir que gcc necesita la -lm
para compilar un programa que refiere una función de la biblioteca matemática. Me pregunto por qué no se necesita un marcador de enlace explícito al compilar programas que contienen otras bibliotecas, como la biblioteca de tiempo. Si escribo un programa donde se llama a la función time()
, se compilará sin problemas, incluso sin opciones de vinculación. Pero un programa con la biblioteca matemática involucrada simplemente no funcionará sin la bandera -lm
.
¿Alguien puede explicar la razón detrás de este comportamiento? Gracias por tu tiempo.
Debido a que time()
y algunas otras funciones están integradas en la librería C ( libc
) y GCC siempre se vincula a libc a menos que use la opción de compilación -ffreestanding
. Sin embargo, las funciones matemáticas viven en libm
que no está implícitamente vinculado por gcc.
Debido a una práctica histórica ridícula que nadie está dispuesto a arreglar. La consolidación de todas las funciones requeridas por C y POSIX en un solo archivo de biblioteca no solo evitaría que esta pregunta se repitiera una y otra vez, sino que también ahorraría una gran cantidad de tiempo y memoria cuando se realiza la vinculación dinámica, ya que cada archivo .so
vinculado requiere la operaciones del sistema de archivos para localizarlo y encontrarlo, y algunas páginas para sus variables estáticas, reubicaciones, etc.
Una implementación donde todas las funciones están en una biblioteca y las -lm
, -lpthread
, -lrt
, etc. son todas no operativas (o el enlace para vaciar archivos .a
) es perfectamente compatible con POSIX y sin duda es preferible.
Nota: estoy hablando de POSIX porque C no especifica nada acerca de cómo se invoca el compilador. Por lo tanto, puede tratar gcc -std=c99 -lm
como la forma específica de implementación en que debe invocarse el compilador para el comportamiento conforme.