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