可能重複:
gcc: why the -lm flag is needed to link the math library?爲什麼你需要一個明確的`-lm`編譯器選項
一般來說,爲了從包括頭分開使用任何的數學函數文件math.h
你必須鏈接鏈接器選項-lm。 -l
這裏意味着鏈接器選項來搜索特定的庫libm.o
。
我的問題是
爲什麼GCC默認不包含這個庫?是因爲庫大量使用數學協處理器,並且需要添加額外的代碼位來初始化浮點初始化(我可能會在這裏使用錯誤的術語)?
注意
我只是回顧了鏈接http://stackoverflow.com提到的所有答案。這對我來說沒有多大意義。有三個基本原因歸因於:
- 標準庫保證可用。顯式鏈接像pthread這樣的其他posix庫顯然是有道理的,但爲什麼我們必須爲標準庫做一個明確的鏈接。即使是歷史原因也不是很清楚。
- 爲什麼libm與libc分離?
- 爲什麼我們仍然在最近的gcc編譯器中繼承這些行爲?它實現了什麼簡單性?這是我測試的,沒有libm和libm。沒有libm中的一個,我寫我自己的戰俘
的版本,這裏是例子
[email protected]:~/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;
}
[email protected]:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o
[email protected]:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l
261
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l
241
歷史原因,我想。鏈接器應該很容易不能鏈接未使用的函數。 MSVC不需要libm就可以使用數學函數。 – Joey 2012-04-29 11:14:48
你不需要它與C++。 – Mat 2012-04-29 11:18:02