Eventuali duplicati:
gcc: why the -lm flag is needed to link the math library?Perché avete bisogno di una esplicita opzione `-lm` compilatore
In generale, al fine di utilizzare una qualsiasi delle funzioni matematiche a parte con l'indicazione dell'header file math.h
devi collegarti con l'opzione linker -lm. -l
qui significherebbe l'opzione linker per cercare la libreria specifica libm.o
.
mia domanda è
Perché GCC non include questa libreria di default? È perché la libreria usa pesantemente il coprocessore matematico e richiede l'aggiunta del bit di codice in più per inizializzare l'inizializzazione in virgola mobile (potrei usare la terminologia sbagliata qui)?
Nota
Ho appena rivisto tutte le risposte di cui il link http://stackoverflow.com. Questo non ha molto senso per me. Ci sono tre ragioni di base attribuite
- Le librerie standard sono garantite per essere disponibili. Il collegamento di altre librerie di posix come pthread ha un significato esplicito, ma perché dobbiamo fare un link esplicito per una libreria standard. Anche la ragione storica non è molto chiara.
- Perché la libm è stata separata dalla libc?
- Perché stiamo ancora ereditando questi comportamenti nei recenti compilatori gcc? Che semplicità ha? Ecco cosa ho provato, senza libm e con libm. L'Uno senza libm, ho scritto la mia versione di Pow
Ecco l'esempio
[email protected]:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
int i=20;
double output1=pow(2.618033988749895,i);
return 0;
}
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y) {
double _Z = 1;
for (; _Y; _X *= _X) {
if (_Y & 1) _Z *= _X;
_Y >>= 1;
}
return _Z;
}
int main() {
int i=20;
double output1=Pow(2.618033988749895,i);
return 0;
}
[email protected]:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o
[email protected]:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l
261
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l
241
Ragioni storiche, immagino. Il linker dovrebbe essere facilmente in grado di non collegare funzioni che non vengono utilizzate. MSVC non ha bisogno di una libm per poter utilizzare le funzioni matematiche. – Joey
Non ne hai bisogno con C++. – Mat