gcc: perché il flag -lm è necessario per colbind la libreria matematica?

Ho appena scoperto che il flag -lm è richiesto da gcc per compilare un programma che fa riferimento a una funzione dalla libreria matematica. Mi chiedo il motivo per cui un flag esplicito di collegamento non è necessario durante la compilazione di programmi contenenti altre librerie come la libreria di orari. Se scrivo un programma in cui viene chiamata la funzione time() , si compila senza problemi anche senza opzioni di collegamento. Ma un programma con la libreria matematica coinvolta non funzionerà senza il flag -lm .

Qualcuno può spiegare la ragione di questo comportamento? Grazie per il tuo tempo.

A causa della pratica storica ridicola che nessuno è disposto a risolvere. Il consolidamento di tutte le funzioni richieste da C e POSIX in un singolo file di libreria non solo eviterebbe di rispondere a questa domanda ripetutamente, ma anche di risparmiare una quantità significativa di tempo e memoria durante il collegamento dinamico, poiché ogni file .so collegato richiede operazioni del filesystem per individuarlo e trovarlo, e poche pagine per le sue variabili statiche, rilocazioni, ecc.

Un’implementazione in cui tutte le funzioni sono in una libreria e le -lm , -lpthread , -lrt , ecc. Sono tutte no-ops (o link a file .a vuoti) è perfettamente conforms a POSIX e sicuramente preferibile.

Nota: sto parlando di POSIX perché C stesso non specifica nulla su come viene richiamato il compilatore. Quindi puoi semplicemente trattare gcc -std=c99 -lm come modo specifico per l’implementazione che il compilatore deve essere invocato per comportamento conforms.

Poiché time() e alcune altre funzioni sono builtin nella libreria C ( libc ) e GCC si collega sempre a libc a meno che non si usi l’opzione -ffreestanding compile. Tuttavia le funzioni matematiche vivono in libm che non è implicitamente collegato da gcc.