C编译失败:找不到math.h函数

我正在写一个素数发现者。 在数学上,它更快,而不是for (unsigned long i = 2; i < number/2; i++)它更快,并且仍然同样有效, for (unsigned long i = 2; i < sqrt(number); i++)

但它不起作用。 以下是我的代码。

 // Stuff goes up here, including a function prototype and: #include  char isPrime (unsigned long number) { if (number <= 1) { return 0; } long double sqrtOfNumber = sqrt(number); // Calculate once. for (unsigned long i = 2; i < sqrtOfNumber; i++) { if (number%i == 0) { // It has a divisor. return 0; } } // Nothing broke us yet.... return 1; } 

接下来是我从GCC得到的错误。

 /tmp/ccFBlUz5.o: In function `isPrime': main.c:(.text+0xb3): undefined reference to `sqrt' collect2: error: ld returned 1 exit status 

将“数字”的类型更改为double会导致%运算符出现问题。 并且将它转换为sqrt()调用的double不会改变任何东西。

任何建议?

哦,我的math.h正在被导入,如果我注释掉那一行,我会收到警告,那里有一个隐含的声明。

  main.c: In function 'isPrime': main.c:28:2: warning: implicit declaration of function 'sqrt' [-Wimplicit-function-declaration] long double sqrtOfNumber = sqrt(number); // Calculate once. ^ main.c:28:29: warning: incompatible implicit declaration of built-in function 'sqrt' [enabled by default] long double sqrtOfNumber = sqrt(number); // Calculate once. ^ 

加上另一个警告。

-lm需要在需要该库的文件之后添加到命令行,例如,如果main.c需要数学库,那么您将使用:

  gcc -xc main.c -lm 

您可以在此处查看实例,示例中有三个命令行。 一个没有-lm ,一个在文件之前使用-lm ,需要它一个文件。

为了完整起见,如果我们在链接的选项上引用gcc文档,则为-l说下面的内容:

[…]在您编写此选项的命令中,它会有所不同; 链接器按照指定的顺序搜索和处理库和目标文件。 因此,’foo.o -lz bar.o’在文件foo.o之后但在bar.o之前搜索库’z’。 如果bar.o引用’z’中的函数,则可能无法加载这些函数。 […]

您需要链接数学库。 在命令行上使用-lm选项。