Функция 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() не должен работать с переменными или что-то в этом роде?

Спасибо за помощь


person Eddy    schedule 20.08.2010    source источник


Ответы (7)


Вам необходимо установить связь с математической библиотекой (используйте «-lm» в командной строке). В случае с константами компилятор, вероятно, умен и предварительно вычисляет sqrt (2.0) (поэтому код, который компилируется, по сути, «b = 1.414...;»)

person Gretchen    schedule 20.08.2010
comment
Это утомительно. А как насчет других библиотек, есть ли у gcc по одной опции для каждой из них? - person qed; 11.08.2013
comment
@qed нет, только один: -l. Итак, -lm выбирает библиотеку с именем 'libm.a'; -lfRod0 выберет библиотеку с именем 'libfRod0.a' На самом деле так было с древних времен unix до рассвета gcc. - person greggo; 28.08.2014

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

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

person RBerteig    schedule 20.08.2010

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

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

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

g++ имя файла.c -o имя файла После успешной компиляции.

Для запуска просто введите ./filename в G++. и введите ./a.out в Gcc.

person Community    schedule 03.06.2014

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

gcc -Wall -o test2 test2.c -lm

Вам нужно сделать ссылку на математическую библиотеку.

person Stephen Canon    schedule 20.08.2010

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

#include " math.h "

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

gcc test.c -lm
person hirday    schedule 13.04.2012
comment
Форма <math.h> в ОП более корректна для стандартных заголовков. Кроме того, " math.h " (с пробелами) не будет работать. - person greggo; 05.09.2014

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

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

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

g++ имя файла.c -o имя файла

person Abhishek Kaushik    schedule 30.05.2014

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

person EnthuDeveloper    schedule 21.10.2011