0

可能重复:
在 C 中包含文件

我正在使用 RunC 编写一个需要 pow 和 floor/truncate 的简单函数。我包括了 math.h。当我使用 main 中的函数时,没有问题。但是,一旦我尝试创建一个单独的 int 函数,突然 RunC 没有 pow 和 floor 函数并给我一个错误。有什么帮助吗?

这是代码: main() 有效,但如果我将其切换为使用上面的函数执行完全相同的操作,它将无法正常工作

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

int sumofsquares(int x){
   int counter = 0;
   int temp = x;

   while (temp != 0 || counter == 100){
      //temp = temp - (int)pow(floor(sqrt(temp)), 2);
      //temp = temp - pow(temp, 0.5);
      printf("%d\n", temp);
      counter = counter + 1;
   }

   /*while(temp != 0){
      temp = temp - (int)pow(floor(sqrt(temp)), 2);
      counter ++;
   }*/
    return counter;
}

int main(void){
   printf("%d", (int)pow(floor(sqrt(3)), 2));
}

这样做:

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

int sumofsquares(int x){
   int counter = 0;
   int temp = x;

   while(temp != 0){
      temp = temp - (int)pow(floor(sqrt(temp)), 2);
      counter ++;
   }
    return counter;
}

int main(void){
   printf("%d", sumofsquares(3));
}

返回此错误:

/tmp/cctCHbmE.o: In function `sumofsquares':
/home/cs136/cs136Assignments/a04/test.c:9: undefined reference to `sqrt'
/home/cs136/cs136Assignments/a04/test.c:9: undefined reference to `floor'
collect2: ld returned 1 exit status
4

2 回答 2

0

在你的工作main职能中,你有

printf("%d", (int)pow(floor(sqrt(3)), 2));

请注意,这里的参数是常量。优化编译器通常会在编译时评估表达式,从而消除对math.h函数的调用,因此即使不链接数学库也可以工作。但是,如果计算涉及变量,则通常无法在编译时对其进行评估,因此对math.h函数的调用仍然存在,并且如果在数学库中没有链接,则链接将失败。尝试

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

int main(int argc, char *argv[]) {
    // don't really use atoi, it's here just for shortness
    int num = argc > 1 ? atoi(argv[1]) : 3;
    printf("%d\n", (int)pow(floor(sqrt(num)),2));
    return EXIT_SUCCESS;
}

如果未在编译器命令行中指定要链接数学库,那也应该无法链接。

在 gcc 中,命令行应该是

gcc -O3 -Wall -Wextra -o foo foo.c -lm

要链接的库应该放在命令行的最后,因为对于许多版本,如果在知道它们需要哪些符号之前指定它们,它将不起作用。

不幸的是,我根本不知道 RunC,所以我还不能告诉你如何在数学库中链接它,我正在尝试找出答案。

我的 google-fu 太弱了。我在 RunC 上没有找到任何有用的文档,而且我不会安装 Ubuntu 来检查工具本身。

于 2012-02-22T21:55:12.467 回答
0

使用 gcc 编译程序:

gcc -lm -o foo foo.c
于 2012-02-22T21:08:07.183 回答