2011-11-25 9 views
10

Actualmente estoy usando gcc para compilar y necesito usar <math.h>. El problema es que no reconocerá la biblioteca. También he intentado -lm y nada. La función Probé a usar era ceil() y me da el siguiente error:Vincular con gcc y -lm no define ceil() en Ubuntu

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

estoy usando la última Ubuntu y math.h está allí. Intenté usar -lm en una computadora diferente y funciona perfectamente.

¿Alguien sabe cómo resolver este problema?


Incluí <math.h>. Además, el comando que utilicé fue:

gcc -lm -o fb file.c 
+4

¿Puedes dar la línea de comando completa que estás usando? – Gian

+0

¿Y recordó '#include ' antes de usar 'ceil'? –

+0

Incluí math.h Además, el comando que utilicé fue: gcc -lm -o fb file.c – drum

Respuesta

17

Tome este código y ponerlo en un archivo 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 de los dos deben trabajar . Si ninguno de los dos funciona, muestre el mensaje de error completo para cada compilación. Tenga en cuenta que -lm aparece después del nombre del archivo fuente (o el archivo objeto si compila el origen al objeto antes de vincular).

+0

@Johnathan Leffler ¿hay alguna manera de hacer esto sin manipular -lm cada vez durante la compilación? – Brandon

+0

@Brandon: ¿migrar a Mac? Las funciones de '' están en la biblioteca del sistema principal, por lo que no necesita especificar '-lm' (aunque hay una' libm.dylib' para darle una biblioteca a la cual vincular si especifica '-lm' en la línea de comando). De lo contrario, asegúrese de estar utilizando un archivo MAKE y tiene 'LDLIBS' (o' LDLIBES') establecido en '-lm' si lo usa lo suficiente para garantizarlo, o escriba las reglas por programa que incluyen/excluyen la biblioteca como requerido por cada programa. Entonces, en otras palabras, "No, no hay forma de evitar especificarlo". Podría preguntarle al equipo de GLibC por qué no han ido a una sola biblioteca. –

+0

Tenga en cuenta que si optimiza el código, es posible que el compilador evalúe 'ceil (1.2)' en tiempo de compilación y evite la necesidad de llamar a la función en tiempo de ejecución, en cuyo caso puede que no necesite la biblioteca '-lm' en absoluto. Pero ese sería un oscuro caso extremo para el programa simple en mi ejemplo: en general, el compilador no podría hacer esa optimización y luego necesitaría vincularse con la biblioteca matemática a menos que las funciones ya estén en el principal biblioteca de sistema. –

9

No tengo suficiente reputación para comentar la respuesta de @Jonathan Leffler. Solo quería mencionar que el libro de Peter van der Linden Expert C Programming tiene un buen tratamiento sobre este tema en el capítulo 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.

Si especifica la biblioteca matemática (que suele ser una estática) antes de que sus archivos objeto, entonces el enlazador no añadir ningún símbolo.

2

tratar de compilar así:

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

que tenían el mismo problema y se resolvió mediante este comando. Además, si instaló su Ubuntu el mismo día que tuvo el problema, podría ser un problema de actualización.

+1

Esta pregunta ha sido respondida durante mucho tiempo. – drum

Cuestiones relacionadas