它';It’真奇怪,有时候gcc会';找不到sqrt的引用,但有时gcc可以

它';It’真奇怪,有时候gcc会';找不到sqrt的引用,但有时gcc可以,c,gcc,ld,math.sqrt,C,Gcc,Ld,Math.sqrt,我试过这个密码 /*main.c*/ #include <stdio.h> /* printf */ #include <math.h> /* sqrt */ int frequency_of_primes (int n) { int i, j; int freq = n - 1; for (i = 2; i <= n; ++i) for (j = sqrt(i); j > 1; --j) if (i%j==0)

我试过这个密码

/*main.c*/
#include <stdio.h>      /* printf */
#include <math.h>       /* sqrt */

int frequency_of_primes (int n) {
  int i, j;
  int freq = n - 1;
  for (i = 2; i <= n; ++i)
  for (j = sqrt(i); j > 1; --j)
    if (i%j==0) {--freq; break;}
  return freq;
}

int main() {
  printf("%f\n", sqrt(4.0));
  return 0;
}

main
函数也会调用
sqrt
,但是
ld
不会报告任何错误。

这是因为优化器正在处理您使用的常量情况


问题在于
sqrt(i)
调用内部
素数频率()
,调用
main()
被优化了。您可以通过读取后一种情况下生成的代码来了解这一点,它只需加载一个常量
2.0
,然后就可以使用它了。

如果您添加
-ffast math
,大多数编译器将使用适当的机器指令而不是函数调用,因此您不需要libm。。。。是的,谢谢你的回答。将sqrt(4.0)替换为sqrt(i),sqrt(i)将i=4.0加倍,并使用gcc-O3编译,然后没有错误报告,但在编译时没有优化。
#include <stdio.h>      /* printf */
#include <math.h>       /* sqrt */

// int frequency_of_primes (int n) {
//   int i, j;
//   int freq = n - 1;
//   for (i = 2; i <= n; ++i)
//   for (j = sqrt(i); j > 1; --j)
//     if (i%j==0) {--freq; break;}
//   return freq;
// }

int main() {
  printf("%f\n", sqrt(4.0));
  return 0;
}