studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones c math linker-errors undefined-reference

programacion - Referencia indefinida a `sin`



manual de programacion android pdf (4)

Esta pregunta ya tiene una respuesta aquí:

Tengo el siguiente código (despojado de lo básico para esta pregunta):

#include<stdio.h> #include<math.h> double f1(double x) { double res = sin(x); return 0; } /* The main function */ int main(void) { return 0; }

Al compilarlo con gcc test.c el siguiente error y no puedo entender por qué:

/tmp/ccOF5bis.o: In function `f1'': test2.c:(.text+0x13): undefined reference to `sin'' collect2: ld returned 1 exit status

Sin embargo, he escrito varios programas de prueba que llaman sin desde dentro de la función main , y esos funcionan perfectamente. Debo estar haciendo algo obviamente mal aquí, pero ¿qué es?


Debes enlazar con la biblioteca matemática, libm:

$ gcc -Wall foo.c -o foo -lm


Ha compilado su código con referencias al archivo de encabezado math.h correcto, pero cuando intentó vincularlo, olvidó la opción de incluir la biblioteca matemática. Como resultado, puede compilar sus archivos de objeto .o, pero no construir su ejecutable.

Como Paul ya ha mencionado, agregue " -lm " para vincular con la biblioteca matemática en el paso donde está intentando generar su ejecutable.

En el comment , linuxD pregunta:

¿Por qué para sin() en <math.h> , necesitamos la opción -lm explícitamente? pero, no para printf() en <stdio.h> ?

Porque ambas funciones se implementan como parte de la "Especificación única UNIX". Este historial de este estándar es interesante y se lo conoce por muchos nombres (IEEE Std 1003.1, X / Open Portability Guide, POSIX, Spec 1170).

Este estándar separa específicamente las rutinas de la "biblioteca estándar C" de las rutinas de la "biblioteca matemática estándar C" (página 277) . El pasaje pertinente se copia a continuación:

Biblioteca estándar C

La biblioteca Standard C se busca automáticamente por cc para resolver referencias externas. Esta biblioteca admite todas las interfaces del Sistema base, tal como se define en el Volumen 1, a excepción de las Rutinas matemáticas.

Biblioteca matemática estándar C

Esta biblioteca admite las rutinas matemáticas del Sistema base, tal como se define en el Volumen 1. La opción cc -lm se usa para buscar en esta biblioteca.

El razonamiento detrás de esta separación fue influenciado por una serie de factores:

  1. Las guerras de UNIX llevaron a una creciente divergencia de la oferta original AT & T UNIX.
  2. El número de plataformas UNIX agregó dificultad en el desarrollo de software para el sistema operativo.
  3. Se lanzó un intento de definir el mínimo común denominador para los desarrolladores de software, llamado 1988 POSIX .
  4. Los desarrolladores de software programaron contra el estándar POSIX para proporcionar su software en "sistemas compatibles con POSIX" para llegar a más plataformas.
  5. Los clientes de UNIX exigieron sistemas UNIX "compatibles con POSIX" para ejecutar el software.

Las presiones que alimentaron la decisión de poner -lm en una biblioteca diferente probablemente incluyeron, pero no están limitadas a:

  1. Parece una buena manera de mantener el tamaño de la libc, ya que muchas aplicaciones no usan funciones integradas en la biblioteca matemática.
  2. Proporciona flexibilidad en la implementación de la biblioteca matemática, donde algunas bibliotecas matemáticas se basan en tablas de búsqueda integradas más grandes, mientras que otras pueden confiar en tablas de búsqueda más pequeñas (soluciones informáticas).
  3. Para aplicaciones de tamaño realmente restringido, permite reimplementaciones de la biblioteca matemática de una manera no estándar (como extraer solo sin() y colocarlo en una biblioteca personalizada.

En cualquier caso, ahora es parte del estándar para no incluirse automáticamente como parte del lenguaje C, y es por eso que debe agregar -lm .


Tengo el problema de todos modos con -lm agregado

gcc -Wall -lm mtest.c -o mtest.o mtest.c: In function ''f1'': mtest.c:6:12: warning: unused variable ''res'' [-Wunused-variable] /tmp/cc925Nmf.o: In function `f1'': mtest.c:(.text+0x19): undefined reference to `sin'' collect2: ld returned 1 exit status

Descubrí recientemente que no funciona si primero especificas -lm. El orden importa:

gcc mtest.c -o mtest.o -lm

Solo enlace sin problemas

Entonces debe especificar las bibliotecas después.


Tuve el mismo problema, que desapareció después de que enumeré mi biblioteca por última vez: gcc prog.c -lm