當我用gcc
編譯一些c代碼時,它添加了-lm
。 富勒例如,當我想在我的程序中使用fmax
,必須使用以下命令:通過添加-lm
gcc中-lm的含義是什麼?
gcc myprogram.c -lm
我不明白髮生在我的計劃? -lm
是什麼意思?
謝謝。
當我用gcc
編譯一些c代碼時,它添加了-lm
。 富勒例如,當我想在我的程序中使用fmax
,必須使用以下命令:通過添加-lm
gcc中-lm的含義是什麼?
gcc myprogram.c -lm
我不明白髮生在我的計劃? -lm
是什麼意思?
謝謝。
比方說,你有main.c
文件:
#include <math.h>
#include <stdio.h>
float my_foo(float a, float b)
{
return fmax(a, b);
}
int main()
{
printf("%f\n", my_foo(4.5, 3.1));
return 0;
}
如果你嘗試編譯它沒有-lm
標誌您會收到undefined reference error
:
main.o: In function `my_foo':
main.c:(.text+0x1d): undefined reference to `fmax'
collect2: error: ld returned 1 exit status
這是因爲,連接器不知道任何實現的fmax
功能。你必須提供它。
在gcc main你可以找到以下-llibrary
標誌的說明:
鏈接時搜索名爲library的庫。(作爲單獨的參數,庫僅作爲第二種替代參數,僅用於POSIX合規性,不建議使用。)
它在命令中編寫此選項時有所不同,鏈接器按照它們指定的順序搜索和處理庫和對象文件。因此,foo.o -lz bar.o在文件foo.o之後但在bar.o之前搜索庫z。如果bar.o引用z中的函數,那些函數可能不會被加載。
鏈接器搜索該庫的一個標準目錄列表,該目錄實際上是一個名爲liblibrary.a的文件。鏈接器然後使用該文件,就好像它已經通過名稱精確指定一樣。
搜索的目錄包括幾個標準系統目錄以及您用-L指定的任何目錄。
通常以這種方式找到的文件是庫文件---其成員是目標文件的存檔文件。鏈接器通過掃描檔案文件來處理定義到目前爲止被引用但未定義的符號的成員。但是,如果找到的文件是普通的目標文件,它將以通常的方式鏈接。 使用-l選項和指定文件名之間的唯一區別在於-l使用lib和.a包圍庫並搜索多個目錄。
它看起來我有儲存在/usr/lib/x86_64-linux-gnu/libm.a libm.a文件:
$ find /usr/lib -iname libm.a
/usr/lib/x86_64-linux-gnu/libm.a
您可以檢查libm.a
包含fmax
定義:
$ nm /usr/lib/x86_64-linux-gnu/libm.a --defined-only | grep fmax
[...]
s_fmax.o:
0000000000000000 W fmax
[...]
這是非常有益的,非常感謝。 – Armaa