为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
梵蒂冈之花 2019-12-15 14:08:34
我有这个简单的代码:max = (int) sqrt (number);在标题中,我有:#include <math.h>但是应用程序仍然说未定义的引用sqrt。您在这里看到任何问题吗?看起来一切都应该没问题。
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

这是我的观察,首先需要将标头math.h作为标头文件中sqrt()声明的函数包括在内math.h。例如


#include <math.h>

其次,如果您阅读sqrt的手册页,您会注意到该行-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-12-16
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

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


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 都出现,为时已晚。



查看完整回答
反对 回复 2019-12-16
  • 3 回答
  • 0 关注
  • 524 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信