Почему я получаю ошибку "неопределенная ссылка на 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
после вашей команды.