Abh*_*jit 10 c floating-point gcc
可能重复:
gcc:为什么链接数学库需要-lm标志?
一般来说,除了包含头文件之外,为了使用任何数学函数,math.h您必须使用链接器选项-lm进行链接.-l这里将指代用于搜索特定库的链接器选项libm.o.
我的问题是
为什么GCC默认不包含此库?是因为库大量使用数学协处理器,它需要添加额外的代码来初始化浮点初始化(我可能在这里使用错误的术语)?
注意
我刚刚查看了链接http://stackoverflow.com中提到的所有答案.这对我来说没什么意义.归因于三个基本原因
这是一个例子
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
int i=20;
double output1=pow(2.618033988749895,i);
return 0;
}
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y) {
double _Z = 1;
for (; _Y; _X *= _X) {
if (_Y & 1) _Z *= _X;
_Y >>= 1;
}
return _Z;
}
int main() {
int i=20;
double output1=Pow(2.618033988749895,i);
return 0;
}
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l
261
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l
241
Run Code Online (Sandbox Code Playgroud)
它适用于不可能或不需要浮点数学的系统(主要是嵌入式).这确实是历史性的,但不要忘记,gcc大多数其他C编译器是在386SX被认为是高性能处理器的时代编写的.
举个例子,当我还在嵌入式计算领域工作时,我们使用标准编译器(Microsoft和Borland)为我们的处理器生成代码(Z80,80186和68030).如果编译器默认链接到数学库,我们就会遇到麻烦,因为我们的系统都没有浮点功能甚至不需要它.
确实,30年之后它似乎很愚蠢,但当时的原因是合理的.