функция 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...;')


вероятно, вам нужно добавить -lm при компиляции. Когда вы берете квадратный корень константы, компилятор оптимизирует код, беря квадратный корень во время компиляции, поэтому он не использует sqrt на всех.


используйте команду gcc -Wall -o "test2" "test2.c" -lm что, вероятно, исправит это.

Это включает в себя математическую библиотеку в дополнение к стандартной библиотеке времени выполнения C. В большинстве систем математическая библиотека исторически является отдельным объектом, который необходимо явно запросить.


в случае gcc вам нужно связать библиотеку.

имя файла gcc.к-лм .

однако в случае g++ нет необходимости связывать библиотеку, так что это будет работать нормально:

G++ и именем.c-o имя файла Как только компиляция будет успешной.

для запуска просто введите ./ имя файла в G++. и входите .a.в Gcc.


скомпилировать с помощью:

gcc -Wall -o test2 test2.c -lm

вам нужно связать с математической библиотекой.


включить математическую библиотеку с помощью оператора""

#include " math.h "

компиляция программы с помощью -lm опция для наследования математической библиотеки предположим, что наша программа называется test.c мы компилируем как следовать

gcc test.c -lm

gcc по умолчанию не связывает стандартные библиотеки. Поэтому вам просто нужно сделать это, если компиляция через gcc:

имя файла gcc.c-lm .

однако в случае g++ нет необходимости связывать библиотеку, так что это будет работать нормально:

G++ и именем.c-o filename


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