2010-11-13 20 views
33

Por qué hace lo siguiente poco de trabajo de código en C:pow() función emite error de referencia definido en C

int res = pow(2, 3); 
printf("%d\n", res); 

mientras que este otro no?

int a = 2; 
int b = 3; 

int res = pow(a, b); 
printf("%d\n", res); 

Incluso si trato

double a = 2; 
double b = 3; 

double res = pow(a, b); 
printf("%f\n", res); 

Obtengo un

referencia indefinida a `pow'

¿Qué estoy haciendo mal?

+0

Un fragmento de código completo sería útil ... –

+0

¿Está incluida la math.h o no? –

+0

Estoy incluyendo math.h, yes. El primer fragmento de código funciona y genera lo que se espera. Los otros dos dan la "referencia indefinida a 'pow'". –

Respuesta

52

Cuando funciona, es porque el cálculo hecho por el propio compilador (e incluido en el binario como si lo escribió)

printf("8\n"); 

Cuando no funciona, se debe a que la función pow está incluido en la biblioteca de matemáticas y la biblioteca de matemáticas no está vinculada con su binario de manera predeterminada.
Para obtener la biblioteca matemática para vincularse, si su compilador gcc es, utilizar

gcc ... -lm ... 

con otros compiladores, debe ser el mismo :)
pero leer la documentación

+4

¡Es perfecto! GCC usa MPFR. Aquí hay información: http://gcc.gnu.org/gcc-4.3/changes.html#mpfropts – swatkat

+0

¡MPFR! Woh! :) Totalmente noqueó cuando estaba tratando exactamente lo mismo y no puedo creer lo que he visto. – Deqing

16

undefined reference to 'pow' suena como un enlazador error. No está enlazando en la biblioteca matemática, incluso si introduce la función pow incluyendo <math.h>.

Con gcc, use el parámetro de la línea de comando -lm para vincularlo en math lib.

+0

-1: respuesta idéntica – karthik

+11

Si nota, las respuestas idénticas se publicaron con una diferencia <= 1 minuto. Eso podría ayudar a explicar por qué. –

2

Uso como este

#include <math.h> 
#include <stdio.h> 

int main(void) 
{ 
    for(int i = 1; i < 5; i++) 
    printf("pow(3.2, %d) = %lf\n", i, pow(3.2, i)); 
    return 0; 
} 

de salida:

pow (3,2, 1) = 3,200000

+0

+1 para el ejemplo de trabajo (aunque realmente no responde a la pregunta): ¿Por qué el downvote? (no fui yo) --- Supongo porque ''% lf '' es un especificador de conversión no válido, pero el downvoter podría ser un poco más útil – pmg

-5

referencia indefinida a `pow'

porque el poder a cualquier número debe tener un valor entero como el poder

pow(x,y) 
where, x must be real and y must be a whole number 
+0

Sé que esto es antiguo, pero solo por mencionar que esto no es correcto , pow() toma dos argumentos dobles. ;) – Pascal

Cuestiones relacionadas