一种 GCC sqrt 函数的错误?

5
以下程序无法在gcc中编译。但在带有.c扩展名的g++和MSC++中可以正常编译。
#include <math.h>
#include <stdio.h>

int main()
{
  double t = 10;
  double t2 = 200;

  printf("%lf\n", sqrt(t*t2));

  return 0;
}

我的系统是CentOS,版本信息如下。

> gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

错误信息:

> gcc test.c
/tmp/ccyY3Hiw.o: In function `main':
test.c:(.text+0x55): undefined reference to `sqrt'
collect2: ld returned 1 exit status

这是一个bug吗?

有人能够帮我进行测试吗?


请参见https://dev59.com/03NA5IYBdhLWcg3wQ7Yw。 - ephemient
5个回答

18

你是否已经链接了数学库?

gcc -lm test.c -o test 

6
因为 g++ 引入了 -lstdc++,而 -lstdc++ 又引入了 -lm - ephemient
2
你不想使用g++编译“原始”的 C 代码。C 和 C++ 是不同的语言。 - Alok Singhal
2
我使用的gcc需要在test.c之后加上-lm(在Ubuntu上为4.6.1)。 - nickd

2

请尝试使用gcc -lm test.c -o test

对于gcc,您需要添加-lm参数告诉它链接数学库。


2

使用标志-lm添加数学库。

> gcc test.c -lm

2

大家都在说这个,但我也要说一下。你必须“告诉”gcc链接到数学库。编译时,不要使用gcc test.c,而是要使用gcc -lm test.c。我希望我只需要#include math.h就可以了,而不需要做其他任何事情。


2

问题在于,gcc -lm test.c -o test无法工作,因为gcc将-lm视为编译器而不是链接器选项。相反,你需要将-lm放在命令的末尾,即gcc -o test test.c -lm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接