Подтвердить что ты не робот

Почему я получаю "undefined ссылку на 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 и другими тригонометрическими функциями. Почему?

4b9b3361

Ответ 1

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

gcc test.c -o test -lm

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

Ответ 2

Вам нужно связать ссылку с

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

gcc test.c  -o test -lm

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

#include<math.h>

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

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

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

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

gcc <filename.extension> -lm