Прежде всего, я прочитал этот пост Зачем вам нужна явная опция компилятора `-lm` и этот gcc: почему флаг -lm необходим для связи математической библиотеки?.Я хочу знать почему это не происходит в случае констант (когда я говорю константы, я имею в виду случайные числа с плавающей запятой / двойные числа)? Если вы не уверены, назовите это литералы с плавающей точкой .
Почему мы должны использовать -lm
, чтобы указать компоновщику использовать функции math.h
только при использовании переменных в качестве параметров, но не констант?Если я использую sqrt(N)
(N - это некоторое число), он прекрасно компилируется без каких-либо ошибок, но когда я передаю некоторую переменную, скажем, sqrt(var)
, это не так.Он говорит:
/usr/bin/ld: /tmp/cc5P9o72.o: in function `main':
sq.c:(.text+0x1b): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
Он должен вести себя одинаково все время (я думаю, что, конечно, я ошибаюсь), поскольку я использую ту же функцию из той же библиотеки.Либо его переменная, либо постоянная.Сначала я подумал, что это какая-то оптимизация компилятора (если это всегда одно и то же значение, почему бы не вычислить его во время компиляции каким-либо другим способом, то есть не использовать библиотеку, так как она не работает), но она не работает, даже если я передаюнекоторая переменная, которая имеет фиксированное значение от начала до конца.Итак, я был неправ там.Что на самом деле здесь происходит?
Ниже приведен фрагмент, который я пробовал:
#include <stdio.h>
#include <math.h>
int main () {
float a=9;
printf("%f",sqrt(a));
return 0;
}