Почему я получаю ошибку "неопределенная ссылка на sqrt", даже если я включаю заголовок math.h?

Я очень плохо знаком с C, и у меня есть этот код:

#include <stdio.h>
#include <math.h>
int main(void)
{
  double x = 0.5;
  double result = sqrt(x);
  printf("The square root of %lf is %lf\n", x, result);
  return 0;
}

Но когда я собираю это с:

gcc test.c -o test

Я получаю ошибку, как это:

/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status

Почему это происходит? Является sqrt() не в math.h заголовочный файл? Я получаю ту же ошибку с cosh и другие тригонометрические функции. Зачем?

6 ответов

Решение

Математическая библиотека должна быть связана при сборке исполняемого файла. Как это сделать, зависит от среды, но в Linux/Unix просто добавьте -lm в команду:

gcc test.c -o test -lm

Математическая библиотека называется libm.soи -l опция команды предполагает lib префикс и .a или же .so суффикс.

Вам нужно связать с -lm опция компоновщика

Вам нужно скомпилировать как

gcc test.c  -o test -lm

Исторически gcc (не g++) по умолчанию не включал бы математические функции при компоновке. Он также был отделен от libc в отдельную библиотеку libm. Для связи с этими функциями вы должны посоветовать компоновщику включить библиотеку. -l опция компоновщика, за которой следует имя библиотеки m таким образом -lm,

Вероятно, это ошибка компоновщика. Добавить -lm переключиться, чтобы указать, что вы хотите связать со стандартной библиотекой C математики (libm) который имеет определение для этих функций (заголовок просто имеет объявление для них - стоит посмотреть разницу)

Потому что вы не сказали компоновщику о местонахождении математической библиотеки. Скомпилировать с помощью gcc test.c -o test -lm

Добавить заголовок:

#include<math.h>

Примечание: используйте abs(), иногда во время оценки sqrt() может принимать отрицательные значения, которые приводят к ошибке домена.

abs () - предоставляет абсолютные значения;

например, abs(-3) =3

Включите -lm в конце вашей команды во время компиляции:

gcc <filename.extension> -lm

Вы должны связать файл заголовка math.h с вашим кодом. Вы можете сделать это, набрав -lm после вашей команды.

Другие вопросы по тегам