Функция sqrt() не работает с переменными аргументами
Я не знаю, упускаю ли я что-то очевидное, но похоже, что я не могу вычислить квадратные корни переменной в C; функция sqrt() работает только с константами. Это мой код:
#include <math.h>
#include <stdio.h>
int main()
{
double a = 2.0;
double b = sqrt(a);
printf("%f", b);
return 0;
}
Когда я запускаю эту программу, я получаю следующую ошибку:
gcc -Wall -o "test2" "test2.c" (in directory: /home/eddy/Code/euler)
/tmp/ccVfxkNh.o: In function `main':
test2.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Compilation failed.
Однако, если я заменю аргумент в sqrt() на константу, такую как, например, 2.0, (b = sqrt(2.0)
), то работает нормально. Sqrt () не должен работать с переменными или что-то?
Спасибо за помощь
8 ответов
Вам нужно связать с библиотекой математики (используйте '-lm' в командной строке). В постоянном случае компилятор, вероятно, умный и предварительно вычисляет sqrt(2.0) (поэтому скомпилированный код по существу имеет вид "b = 1.414...;")
В случае gcc вам нужно связать библиотеку.
gcc filename.c -lm.
Однако в случае g ++ нет необходимости связывать библиотеку, так что это будет работать нормально:
g ++ filename.c -o filename После успешной компиляции.
Для запуска просто введите./filename в G++. и введите./a.out в Gcc.
Вам, вероятно, нужно добавить -lm
когда вы компилируете. Когда вы берете квадратный корень из константы, компилятор оптимизирует код, беря квадратный корень во время компиляции, поэтому он не использует sqrt
совсем.
Используйте команду gcc -Wall -o "test2" "test2.c" -lm
который скорее всего это исправит.
Это включает в себя математическую библиотеку в дополнение к стандартной библиотеке времени выполнения C. В большинстве систем математическая библиотека исторически является отдельным объектом, который необходимо явно запрашивать.
Включить математическую библиотеку, используя оператор " "
#include " math.h "
скомпилировать программу используя -lm
опция для наследования математической библиотеки предположим, что наша программа называется test.c
мы компилируем как следовать
gcc test.c -lm
Компилировать с:
gcc -Wall -o test2 test2.c -lm
Вам нужно сделать ссылку на математическую библиотеку.
По умолчанию gcc не связывает стандартные библиотеки. Так что вам просто нужно сделать это, если вы компилируете через gcc:
gcc filename.c -lm.
Однако в случае g++ нет необходимости связывать библиотеку, так что это будет работать нормально:
g++ filename.c -o filename
Это прекрасно работает для меня. Я думаю, что есть некоторая проблема с вашей математикой. Попробуйте связать это снова и посмотрите. Другой мудрый кодекс совершенно совершенен.