为什么调用Math.h中的函数时会出现链接错误?

为什么调用Math.h中的函数时会出现链接错误?,math,gcc,linker,Math,Gcc,Linker,在尝试调用math.h中的函数时,我遇到如下链接错误 undefined reference to sqrt 但是我正在做一个#include 我使用gcc并编译如下: gcc -Wall -D_GNU_SOURCE blah.c -o blah 为什么链接器找不到sqrt的定义?您需要显式链接数学库。将-lm添加到要传递给gcc的标志中,以便链接器知道在调用gcc时将libm.a将-lm添加到命令中: gcc-Wall-D_GNU__源代码blah.c-o blah-lm 这将告诉链接器链

在尝试调用
math.h
中的函数时,我遇到如下链接错误

undefined reference to sqrt
但是我正在做一个
#include

我使用gcc并编译如下:

gcc -Wall -D_GNU_SOURCE blah.c -o blah

为什么链接器找不到
sqrt
的定义?

您需要显式链接数学库。将
-lm
添加到要传递给gcc的标志中,以便链接器知道在调用gcc时将
libm.a

将-lm添加到命令中:
gcc-Wall-D_GNU__源代码blah.c-o blah-lm

这将告诉链接器链接到数学库。包含math.h将告诉编译器像sqrt()这样的数学函数存在,但它们是在单独的库中定义的,链接器需要将其与可执行文件打包


正如FreeMemory所指出的,这个库被称为libm.a。在类Unix系统上,命名库的规则是lib[blah].a。然后,如果要将它们链接到可执行文件,可以使用-l[blah]。

-lm
附加到gcc命令的末尾以链接数学库:

gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
对于要正确链接的对象,编译器标志的顺序很重要!具体而言,应放置
-lm


如果您想知道为什么在用C编译时需要包含
math.h
库,请查看以下说明

你知道,你能修好它,对吗?:)你可以随时编辑你的答案和问题。事实上,如果你在现代Linux系统上这样做,你最终会链接到libm.so,它是libm.a的动态库等价物。