gpt4 book ai didi

c - 仅当参数不是常量时,math.h 中的 sqrt 才会导致链接器错误 "undefined reference to sqrt"

转载 作者:行者123 更新时间:2023-11-30 16:38:02 29 4
gpt4 key购买 nike

我创建了一个小程序,如下:

  #include <math.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
int i;
double tmp;
double xx;

for(i = 1; i <= 30; i++) {
xx = (double) i + 0.01;

tmp = sqrt(xx);
printf("the square root of %0.4f is %0.4f\n", xx,tmp);
sleep(1);
xx = 0;
}

return 0;
}

当我尝试使用以下命令编译它时,出现编译器错误。

gcc -Wall calc.c -o calc

返回:

/tmp/ccavWTUB.o: In function `main':
calc.c:(.text+0x4f): undefined reference to `sqrt'
collect2: ld returned 1 exit status

如果我将 sqrt(xx) 调用中的变量替换为 sqrt(10.2) 等常量,则它可以正常编译。或者,如果我明确链接如下:

gcc -Wall -lm calc.c -o calc

它也工作得很好。谁能告诉我这是什么原因造成的?我已经成为 C 程序员很长时间了(并且我使用 math.h 编写过类似的小程序),但我从未见过这样的事情。

我的 gcc 版本如下:

$ gcc --version
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Copyright (C) 2008 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.
$

最佳答案

如果您在使用 sqrt(10.2) 的情况下查看编译器的输出,我敢打赌您会看到对 sqrt() 的调用实际上并不是制造出来的。

发生这种情况是因为 GCC 识别了几个可以特殊处理的函数。这使其能够进行某些优化,在本例中为 Constant folding 。这种特殊函数称为 Built-ins .

在必须链接到数学库的情况下(因为您使用变量调用它),您需要显式链接它。有些操作系统/编译器会为您做这件事,这就是为什么您过去可能没有注意到。

关于c - 仅当参数不是常量时,math.h 中的 sqrt 才会导致链接器错误 "undefined reference to sqrt",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47618797/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com