Referencia indefinida a pow() en C, a pesar de incluir math.h [duplicate]

2 minutos de lectura

avatar de usuario
ian caballero

Posible duplicado:

Problema al usar pow() en C
qué es ‘referencia indefinida a ‘pow’

Tengo un pequeño problema con un trabajo de curso simple para la universidad que realmente me desconcierta.

Esencialmente, tengo que escribir un programa que, entre otras cosas, calcule el volumen de una esfera a partir de un radio dado. Pensé que usaría el pow() función en lugar de simplemente usar r*r*rpara puntos adicionales de Brownie, pero el compilador sigue dándome el siguiente error:

referencia indefinida a ‘pow’ collect2: error: ld devolvió 1 estado de salida

Mi código se parece a lo siguiente:

#include <math.h>

#define PI 3.14159265 //defines the value of PI

/* Declare the functions */
double volumeFromRadius(double radius);

/* Calculate the volume of a sphere from a given radius */
double volumeFromRadius(double radius) {
    return (4.0/3.0) * PI * pow(radius,3.0f);
}

y estoy compilando con el comando gcc -o sphere sphere.c

Esto compila y funciona bien en code::blocks en las máquinas Windows en la universidad, pero en mi Fedora 17 en casa, el compilador de la línea de comandos se niega a ejecutarse. ¡Cualquier idea sería apreciada con gratitud!

Bendiciones Ian

Necesita vincular con la biblioteca de matemáticas:

gcc -o sphere sphere.c -lm

El error que estás viendo: error: ld returned 1 exit status es del enlazador ld (parte de gcc que combina los archivos de objetos) porque no puede encontrar dónde está la función pow se define.

Incluso math.h trae la declaración de las diversas funciones y no su definición. La definición está presente en la biblioteca de matemáticas. libm.a. Debe vincular su programa con esta biblioteca para que se resuelvan las llamadas a funciones como pow().

  • Esto resolvió mi problema. Sin embargo, tengo 2 cajas de Ubuntu 20.04 con Code::Blocks instalado como IDE. Uno compila el código fuente (incluidas las funciones matemáticas) correctamente sin -lmy las otras necesidades -lm. ¿Cómo se puede compilar la segunda caja sin -lm?

    – geohei

    24 de septiembre de 2020 a las 7:17


  • @geohei, probablemente una ventana se esté compilando en el lanzamiento y la otra en la depuración. Lo que parece es que compilar en lanzamiento con bloques de código no requiere -lm.

    – Alessandro Muntoni

    26 de noviembre de 2020 a las 16:11


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad