2011-11-25 5 views
10

Attualmente sto usando gcc per compilare e ho bisogno di usare <math.h>. Il problema è che non riconoscerà la libreria. Ho anche provato -lm e niente. La funzione ho provato ad usare era ceil() e ottengo il seguente errore:Il collegamento con gcc e -lm non definisce ceil() su Ubuntu

: undefined reference to `ceil' 
collect2: ld returned 1 exit status 

Sto usando l'ultima Ubuntu e math.h c'è. Ho provato a utilizzare -lm in un altro computer e funziona perfettamente.

Qualcuno sa come risolvere questo problema?


Ho incluso <math.h>. Inoltre, il comando che ho usato era:

gcc -lm -o fb file.c 
+4

Puoi fornire l'intera riga di comando che stai utilizzando? – Gian

+0

E ti sei ricordato di "#include " prima di usare 'ceil'? –

+0

Ho incluso math.h Inoltre, il comando che ho usato era: gcc -lm -o fb file.c – drum

risposta

17

Prendi questo codice e metterlo in un file ceil.c:

#include <math.h> 
#include <stdio.h> 
int main(void) 
{ 
    printf("%f\n", ceil(1.2)); 
    return 0; 
} 

compilarlo con:

$ gcc -o ceil ceil.c 
$ gcc -o ceil ceil.c -lm 

Uno di questi due dovrebbe funzionare . Se nessuno dei due funziona, mostra il messaggio di errore completo per ogni compilazione. Notare che -lm viene visualizzato dopo il nome del file di origine (o il file oggetto se si compila l'origine all'oggetto prima del collegamento).

+0

@Johnathan Leffler c'è un modo per farlo senza dover scrivere -lm ogni volta durante la compilazione? – Brandon

+0

@Brandon: migrazione a Mac? Le funzioni da '' sono nella libreria di sistema principale, quindi non è necessario specificare '-lm' (anche se esiste un' libm.dylib' per fornire una libreria a cui collegarsi se si specifica '-lm' sulla riga di comando). Altrimenti, assicurati di utilizzare un makefile e di avere 'LDLIBS' (o' LDLIBES') impostato su '-lm' se lo usi abbastanza da giustificarlo - o scrivi regole per programma che includano/escludano la libreria come richiesto da ciascun programma. Quindi, in altre parole, "No, non c'è un modo per evitare di specificarlo". Potresti chiedere al team GLibC perché non sono andati in una singola libreria. –

+0

Si noti che se si ottimizza il codice, è possibile che il compilatore valuti 'ceil (1.2)' in fase di compilazione ed eviti la necessità di richiamare la funzione in fase di esecuzione, nel qual caso potresti non aver bisogno della libreria '-lm' affatto. Ma questo sarebbe un oscuro caso limite per il semplice programma nel mio esempio - in generale, il compilatore non sarebbe in grado di fare quell'ottimizzazione e quindi avresti bisogno di collegarti con la libreria matematica a meno che le funzioni non siano già nel main libreria di sistema. –

9

Non ho abbastanza reputazione per commentare la risposta di @Jonathan Leffler. Volevo solo menzionare che il libro di Peter van der Linden Expert C Programming ha un buon trattamento su questo argomento nel capitolo 5 Thinking of Linking.

Archives (static libraries) are acted upon differently than are shared objects (dynamic libraries). With dynamic libraries, all the library symbols go into the virtual address space of the output file, and all the symbols are available to all the other files in the link. In contrast, static linking only looks through the archive for the undefined symbols presently known to the loader at the time the archive is processed.

Se si specifica la libreria matematica (che di solito è uno statico) prima che i file oggetto, quindi il linker non aggiungere alcun simbolo.

2

provare a compilare come quella:

gcc -Wall -g file.c -lm -o file 

Ho avuto lo stesso problema ed è stato risolto con questo comando. Inoltre, se hai installato Ubuntu lo stesso giorno in cui hai avuto il problema, potrebbe trattarsi di un problema di aggiornamento.

+1

Questa domanda è stata a lungo risposta. – drum

Problemi correlati