Использование функции pow () генерирует неопределенную ошибку ссылки в C - PullRequest
33 голосов
/ 13 ноября 2010

Почему следующий бит кода работает в C:

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

, а другой - нет?

int a = 2;
int b = 3;

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

Даже если я пытаюсь

double a = 2;
double b = 3;

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

Я получаю

неопределенную ссылку на `pow '

Что я делаю не так?

Ответы [ 4 ]

54 голосов
/ 13 ноября 2010

Когда это работает, это потому, что вычисление было выполнено самим компилятором (и включено в двоичный файл, как будто вы записали его)

printf("8\n");

Когда это не работает, это потому, что *Функция 1004 * включена в математическую библиотеку, а математическая библиотека не связана с вашим двоичным файлом по умолчанию.
Чтобы получить математическую библиотеку для связи, если ваш компилятор - gcc, используйте

gcc ... -lm ...

С другими компиляторами должно быть то же самое:)
, но читать документацию

17 голосов
/ 13 ноября 2010

undefined reference to 'pow' звучит как ошибка компоновщика.Вы не создаете ссылки в математической библиотеке, даже если вы вводите функцию pow, включив <math.h>.

С gcc, используйте параметр командной строки -lm для ссылки в математической библиотеке.

2 голосов
/ 13 ноября 2010

Используйте вот так

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

Выход:

pow (3.2, 1) = 3.200000

0 голосов
/ 13 ноября 2010

неопределенная ссылка на `pow '

потому что мощность любого числа должна иметь целочисленное значение как мощность

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