2012-04-29 13 views
9

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

  1. 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.
  2. Perché la libm è stata separata dalla libc?
  3. 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 
+2

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

+0

Non ne hai bisogno con C++. – Mat

risposta

7

È di ospitare sistemi (principalmente incorporati) in cui la matematica in virgola mobile non è possibile o necessaria. È un po 'storico, ma non dimenticare che gcc e la maggior parte degli altri compilatori C sono stati scritti in un momento in cui un 386SX era considerato un processore ad alte prestazioni.

Per fornire un esempio, quando lavoravo ancora nel calcolo integrato, abbiamo utilizzato compilatori standard (Microsoft e Borland) per generare codice per i nostri processori (Z80, 80186 e 68030).Se i compilatori fossero collegati per impostazione predefinita alla libreria matematica, avremmo avuto dei problemi poiché nessuno dei nostri sistemi aveva funzionalità in virgola mobile o addirittura ne aveva avuto bisogno.

È vero che 30 anni dopo sembra sciocco ma la ragione era valida in quel momento.

1

Ci sono molte librerie si può desiderare, e libm è solo uno di loro.
Per ognuno di questi, è possibile chiedere perché non è incluso per impostazione predefinita.

Forse libm è più utile di altri, ma ancora, C preferisce mantenere le cose semplici - si vuole una libreria, utilizzare -l di usarlo.

+5

Ma la cosa unica di 'libm' è che fa parte della libreria standard C. AFAIK, è l'unica parte della libreria standard C che non è collegata per impostazione predefinita. –

+1

@OliCharlesworth, buon punto. Sarebbe bello se "standard" e "collegati di default" fossero la stessa cosa. – ugoren

1

ragioni storiche

Le ragioni libc e libm sono separati e si deve specificare -lm sulla riga di comando sono ragioni storiche, perché il libm è stato utilizzato anche dal compilatore Fortran.

+0

Quindi la stessa libm può essere condivisa da Fortran e C era la ragione per separare? Quando colleghiamo il programma Fortran, dobbiamo collegarlo esplicitamente con '-lm' mentre andiamo con gcc? – Abhijit

Problemi correlati