Функция 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

Это прекрасно работает для меня. Я думаю, что есть некоторая проблема с вашей математикой. Попробуйте связать это снова и посмотрите. Другой мудрый кодекс совершенно совершенен.

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