79

我有这个简单的代码:

max = (int) sqrt (number);

在标题中我有:

#include <math.h>

但是应用程序仍然说未定义的引用sqrt。你看到这里有什么问题吗?看起来一切都应该没问题。

4

5 回答 5

113

您可能会发现您必须链接到您正在使用的任何系统上的数学库,例如:

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

包含头文件可以让编译器了解函数声明,但它不一定会自动链接到执行该函数所需的代码。

如果做不到这一点,您需要向我们展示您的代码、编译命令和您正在运行的平台(操作系统、编译器等)。

以下代码可以正常编译和链接:

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

请注意,某些编译系统取决于在命令行中给出库的顺序。我的意思是,他们可以按顺序处理库,并且仅使用它们来满足序列中该点处未解析的符号。

因此,例如,给定命令:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

并且plugh.o需要xyzzy图书馆的东西,第二个可能无法按您的预期工作。在您列出库的位置,没有需要满足的未解析符号。

而当plugh.o do中未解决的符号出现时,为时已晚。

于 2011-03-09T16:34:53.533 回答
27

我想你已经导入了 math.h#include <math.h>

所以我能看到的唯一其他原因是缺少链接信息。您必须将您的代码与该-lm选项相关联。

如果你只是想用 gcc 编译一个文件,只需添加-lm到你的命令行,否则,提供一些关于你的构建过程的信息。

于 2011-03-09T16:36:53.310 回答
3

只需在#include <math.h>最后添加 in c 源文件和 Makefile 中的 -lm 即可。

    gcc -pthread -o p3 p3.c -lm
于 2017-07-09T20:01:49.263 回答
2

这是我的观察,首先你需要将头文件包含在头文件中声明math.hsqrt()函数中math.h。例如

#include <math.h>

其次,如果您阅读sqrt的手册页,您会注意到这一行Link with -lm。

#include <math.h> /* header file you need to include */

double sqrt(double x); /* prototype of sqrt() function */

Link with -lm. /* Library linking instruction */

但应用程序仍然说未定义的 sqrt 引用。你看到这里有什么问题吗?

编译器错误是正确的,因为您没有将程序与库lm链接,并且链接器无法找到 的引用sqrt(),您需要显式链接它。例如

gcc -Wall -Wextra -Werror -pedantic test.c -lm
于 2019-07-28T05:39:40.347 回答
-1

我有同样的问题,但我只是通过在运行我的代码的命令之后添加 -lm 来解决它。例子。gcc 代码.c -lm

于 2017-02-05T21:32:52.280 回答