为什么'-lm'仅在将变量传递给'math.h'函数时才显式使用?

问题描述 投票:1回答:1

首先,我读过这篇文章Why do you need an explicit `-lm` compiler option和这个gcc: why is the -lm flag needed to link the math library?。我想知道为什么在常数的情况下不会发生(当我说常数时,我的意思是随机漂浮/双打)?如果你感到困惑,可以称之为浮点文字。

为什么我们必须使用-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;
}
c math gcc linker compiler-optimization
1个回答
4
投票

这很简单。当你传递常量时,许多编译器会对它进行评估(在这样一个简单的例子中,当结果不是float不准确且容易出现实现差异时)编译时不调用math.h函数。

即使您没有传递常量值并在没有数学错误检查和快速数学的情况下编译它,编译器也会生成直接浮点机器代码指令而不调用库函数

在询问使用godbolt.org检查生成的代码之前,通常它会回答您的所有问题

© www.soinside.com 2019 - 2024. All rights reserved.