【发布时间】:2019-03-04 07:50:07
【问题描述】:
首先,我读过这篇文章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
当我使用同一个库中的同一个函数时,它应该一直表现相同(我想是这样,但我当然错了)。它的变量或常数。我首先认为它是某种编译器优化(如果它每次都是相同的值,为什么不通过其他方式编译时计算它,即不使用库,因为它不起作用)但即使我通过它也不起作用一些从头到尾都有固定值的变量。所以,我错了。这里到底发生了什么?
下面是我试过的sn-p:
#include <stdio.h>
#include <math.h>
int main () {
float a=9;
printf("%f",sqrt(a));
return 0;
}
【问题讨论】:
-
因为默认情况下链接器不与数学库链接。这不是一个问题。
-
数学函数很昂贵,传统上不常用。因此,为了节省空间,它们被放入了自己的库中。
-
我在链接的帖子上读到了这一点。问题是为什么只使用变量?
-
C 原生支持浮点常量和变量。此外,新编译器不再需要 -lm 和数学函数。
-
那么为什么它不适用于变量中的整数/浮点数
标签: c math gcc linker compiler-optimization