Почему '-lm' используется явно только при передаче переменных в функции 'math.h'? - PullRequest
0 голосов
/ 04 марта 2019

Прежде всего, я прочитал этот пост Зачем вам нужна явная опция компилятора `-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;
}

1 Ответ

0 голосов
/ 04 марта 2019

Это очень просто.Когда вы передаете константы, многие компиляторы будут оценивать ее (в таком тривиальном примере, когда результат не является погрешностями с плавающей точкой и возможны различия в реализации), время компиляции без вызова функций math.h.

Даже если вы не передаетезначения констант и скомпилируйте их без математических проверок ошибок и быстрой математики, компилятор сгенерирует инструкции машинного кода с плавающей запятой без вызова библиотечных

Перед тем, как запросить проверку сгенерированного кода, например, используя godbolt.org,и обычно он ответит на все ваши вопросы

...