【发布时间】:2019-04-01 09:13:28
【问题描述】:
以下代码:
#include <stdio.h>
#include <math.h>
int main(void)
{
long long int a;
scanf("%lld", &a);
printf("%lf", sqrt(a));
return 0;
}
给出输出:
source_file.c: In function ‘main’:
source_file.c:9:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld", &a);
^
/tmp/ccWNm2Vs.o: In function `main':
source.c:(.text.startup+0x65): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
但是,如果我执行long long int a = 25; 并删除scanf 语句,或者只是执行sqrt(25),它们都可以工作(正确地给出输出5.000000)。
我检查了this question,但它适用于 C++ 并使用函数重载,而 Afaict C 没有函数重载(这就是为什么我们有 sqrtf、sqrt、sqrtl 如果我没记错的话) .此外,无论我采用long long int 还是double 类型的a,上述代码都会失败。所以,这些问题可能不相关。
另外,关于另一个linked question,对于我来说,对于不断定义的值并没有发生错误,而链接问题恰好是这种情况。
那是什么原因呢?为什么常量值对sqrt 有效,而可变的用户输入值却不行?
【问题讨论】:
-
你有链接到
-lm例如gcc -Wall test.c -lm吗? -
显示你的确切构建命令和 gcc 版本
-
另外你应该
-std=c99(或更高版本,例如-std=c11),因为使用long long -
@M.M
-Wall -lm -std=gnu99 -O2 -o a.out source_file.c我也试过-Wall -lm -o a.out source_file.c没有成功。 -
@GaurangTandon
-lm必须在最后,正如 Achal 所建议的那样