Actualmente estoy usando gcc para compilar y necesito usar <math.h>.
El problema es que no reconoce la biblioteca.
También he tratado de -lm y nada.
La función que he tratado de usar fue ceil() y me da el siguiente error:

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

Estoy usando la última de Ubuntu y matemáticas.h está ahí.
Traté de usar -lm en un equipo diferente y que funcione perfectamente.

¿Alguien sabe cómo solucionar este problema?


Incluyen <math.h>. Además, el comando que se utiliza:

gcc -lm -o fb file.c
Le puede dar el total de la línea de comandos que está utilizando?
¿Y usted recuerde #include <math.h> antes de utilizar ceil?
Hice incluir las matemáticas.h También, el comando que se utiliza: gcc -lm -o fb archivo.c
¿Especificar -lm después el nombre del archivo de origen?
Ahí está el problema – especificar las bibliotecas después de que el nombre del archivo de origen.

OriginalEl autor drum | 2011-11-25

3 Comentarios

  1. 20

    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;
    }

    Compilar con:

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

    Uno de los dos debería funcionar. Si ninguno de los dos trabajos, mostrar el mensaje de error completa para cada compilación. Tenga en cuenta que -lm aparece después del nombre del archivo de origen (o el archivo de objeto si se compila el código fuente a objeto antes de vinculación).

    Notas:

    1. Un moderno compilador podría optimizar el código para pasar 2.0 directamente a printf() sin llamar ceil() en todo en tiempo de ejecución, por lo que no habría necesidad de la matemática de la biblioteca.

    2. Regla de oro: objeto de la lista de archivos y los archivos de origen en la línea de comandos antes de las bibliotecas. Esta respuesta muestra que en uso: el -lm viene después de que el archivo de origen ceil.c. Si usted está construyendo con make etc, entonces se suele utilizar ceil.o en la línea de comandos (junto con otros archivos de objeto); normalmente, usted debe tener una lista de todos los archivos objeto antes de que cualquiera de las bibliotecas.

    En ocasiones hay excepciones a la regla general, pero son raros y sería documentado para los casos particulares donde la excepción es la espera. En la ausencia de documentación explícita en contrario, aplicar la regla de pulgar.

    Leffler hay una manera de hacer esto sin tpying -lm cada vez que durante la compilación?
    Migrar a Mac? Las funciones de <math.h> están en el sistema principal de la biblioteca, por lo que no es necesario especificar -lm (aunque no es un libm.dylib para darle una biblioteca de enlace en contra de si especifica -lm en la línea de comandos). De lo contrario, asegúrese de que está utilizando un archivo makefile y tiene LDLIBS (o LDLIBES) para -lm si lo uso bastante para justificar o escribir por reglas del programa que incluir/excluir de la biblioteca requerida por cada programa. Así que, en otras palabras, «No, No hay una manera de evitar especificar». Usted podría pedir a la GLibC equipo ¿por qué no han ido a una sola biblioteca.
    Tenga en cuenta que si usted optimizar el código, es posible que el compilador para evaluar ceil(1.2) en tiempo de compilación y evitar la necesidad de llamar a la función en tiempo de ejecución, en cuyo caso puede que no necesite el -lm de la biblioteca. Pero que sería de un oscuro borde-el caso de la simple programa en mi ejemplo — en general, el compilador no sería capaz de hacer que la optimización y, a continuación, usted tendría que enlace con la matemática de la biblioteca, a menos que las funciones ya están en el sistema principal de la biblioteca.
    Gracias! Me había perdido poner la bandera después de que el archivo.

    OriginalEl autor Jonathan Leffler

  2. 9

    No tienen suficiente reputación para comentar @Jonathan Leffler respuesta. Sólo quería mencionar que Peter van der Linden libro Experto En Programación C tiene un buen tratamiento de este tema en el capítulo 5 El pensamiento de la Vinculación.

    Archivos (bibliotecas estáticas) se actúe de manera diferente de lo que son los objetos compartidos (librerías dinámicas). Con la dinámica de las bibliotecas, todos los símbolos de biblioteca entrar en el espacio de direcciones virtual del archivo de salida, y todos los símbolos están disponibles para todos los otros archivos en el enlace. En contraste, la vinculación estática sólo se ve a través de los archivos para que el indefinido símbolos conocidos en la actualidad para el cargador en el momento en que el archivo se procesa.

    Si se especifica la librería math (que es generalmente una estática) antes de que su objeto de archivos, a continuación, el vinculador no agregar cualquier símbolos.

    OriginalEl autor Daniel Näslund

  3. 3

    Tratar de compilar como que:

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

    Tuve el mismo problema y se solucionó el uso de este comando. También si ha instalado el Ubuntu, el mismo día en que tuvo el problema podría ser un problema de actualización.

    Esta pregunta ha sido contestada.
    La regla de oro: las bibliotecas después de la fuente o archivos objeto — este de la línea de comandos de la siguiente manera que se pudren.

    OriginalEl autor user4371544

Dejar respuesta

Please enter your comment!
Please enter your name here