2017-05-25 94 views
1

当我用gcc编译一些c代码时,它添加了-lm。 富勒例如,当我想在我的程序中使用fmax,必须使用以下命令:通过添加-lmgcc中-lm的含义是什么?

gcc myprogram.c -lm 

我不明白发生在我的计划? -lm是什么意思?

谢谢。

回答

1

比方说,你有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 
[...] 
+0

这是非常有益的,非常感谢。 – Armaa