首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么即使我包含了math.h头文件,也会出现“未定义的对sqrt的引用”错误?

为什么即使我包含了math.h头文件,也会出现“未定义的对sqrt的引用”错误?
EN

Stack Overflow用户
提问于 2012-05-02 14:53:16
回答 3查看 259.6K关注 0票数 134

我对C语言非常陌生,我有这样的代码:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>
int main(void)
{
  double x = 0.5;
  double result = sqrt(x);
  printf("The square root of %lf is %lf\n", x, result);
  return 0;
}

但当我使用以下命令编译此代码时:

代码语言:javascript
复制
gcc test.c -o test

我得到一个类似下面这样的错误:

代码语言:javascript
复制
/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status

这一切为什么要发生?math.h头文件中不包含sqrt()吗?对于cosh和其他三角函数,我得到了同样的错误。为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-02 14:55:27

在生成可执行文件时,必须链接数学库。具体方法因环境而异,但在Linux/Unix中,只需在命令中添加-lm即可:

代码语言:javascript
复制
gcc test.c -o test -lm

数学库被命名为libm.so-l命令选项采用lib前缀和.a.so后缀。

票数 206
EN

Stack Overflow用户

发布于 2012-05-02 14:55:12

您需要使用-lm链接器选项链接

您需要编译为

代码语言:javascript
复制
gcc test.c  -o test -lm

在历史上,默认情况下,gcc (不是g++)在链接时不会包含数学函数。它也已经从libc分离到一个单独的库libm上。要链接这些函数,您必须建议链接器包含库-l链接器选项,后跟库名m,即-lm

票数 34
EN

Stack Overflow用户

发布于 2017-03-03 13:29:36

添加标题:

#include<math.h>

注意:使用abs(),有时在求值时sqrt()会取负值,这会导致域错误。

abs()-提供绝对值;

例如,abs(-3) =3

在编译时将-lm包含在命令的末尾:

gcc <filename.extension> -lm

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10409032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档