对sqrt(或其他数学函数)的未定义引用

Way*_*int 57 c linker-errors undefined-reference

我有这个简单的代码:

max = (int) sqrt (number);
Run Code Online (Sandbox Code Playgroud)

在标题中我有:

#include <math.h>
Run Code Online (Sandbox Code Playgroud)

但应用程序仍然表示未定义的引用sqrt.你觉得这里有什么问题吗?看起来一切都应该没问题.

pax*_*blo 87

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

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.
Run Code Online (Sandbox Code Playgroud)

包括标题让编译器知道函数的声明,但它并没有必然自动链接到执行该功能所需要的代码.

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

以下代码编译并链接正常:

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

请注意,某些编译系统依赖于命令行中给定库的顺序.由此,我的意思是他们可以按顺序处理库,只使用它们来满足序列中该点的未解析符号.

因此,例如,给定命令:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o
Run Code Online (Sandbox Code Playgroud)

并且plugh.o要求xyzzy库中的某些东西,第二个可能无法按预期工作.在列出库的位置,没有未满足的未解析符号.

当从解析的符号plugh.o 出现,为时已晚.

  • 还要注意链接库的顺序.我发现在命令行中我已经太早了 - 将它移动到最后会解决相关的错误消息.这似乎也依赖于gcc版本(一些旧版本并不介意这么多). (2认同)

krt*_*tek 24

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

因此,我能看到的另一个原因是缺少链接信息.您必须将代码与-lm选项相关联.

如果您只是尝试使用gcc编译一个文件,只需添加-lm到命令行,否则,请提供有关构建过程的一些信息.