【问题标题】:Why Am I Getting Link Errors When Calling Function in Math.h?为什么在 Math.h 中调用函数时出现链接错误?
【发布时间】:2008-09-19 16:21:31
【问题描述】:

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

undefined reference to sqrt

但我正在做一个#include <math.h>
我正在使用 gcc 并编译如下:

gcc -Wall -D_GNU_SOURCE blah.c -o blah

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

【问题讨论】:

    标签: math gcc linker


    【解决方案1】:

    调用 gcc 时在命令中添加 -lm:
    gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm

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

    正如 FreeMemory 指出的那样,该库称为 libm.a 。在类 Unix 系统上,命名库的规则是 lib[blah].a 。然后,如果您想将它们链接到您的可执行文件,请使用 -l[blah] 。

    【讨论】:

    • 实际上,如果你在现代 Linux 系统上这样做,你最终会链接到 libm.so,它是 libm.a 的动态库等价物。
    【解决方案2】:

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

    【讨论】:

    • 你知道,你可以修复它,对吧? :) 您可以随时编辑您的答案和问题。
    【解决方案3】:

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

    gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
    

    要正确链接,编译器标志的顺序很重要!具体来说,-lm 应该放在at the end of the line

    如果您想知道为什么在用 C 编译时需要包含 math.h 库,请查看此解释 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多