有时gcc找不到sqrt的引用但有时gcc可以,这真的很奇怪

时间:2015-10-22 10:27:33

标签: 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) {--freq; break;}
  return freq;
}

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

并使用gcc main.c对其进行编译,它报告undefined reference to sqrt'. I already know add - lm`选项可以解决此问题。但令我惊讶的是:

#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不会报告任何错误。

1 个答案:

答案 0 :(得分:7)

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

sqrt(i)内的frequency_of_primes()调用是问题,main()中的调用已经过优化。您可以通过阅读后一种情况的生成代码来解决这个问题,它只需加载常量2.0并完成它。