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

时间:2013-10-15 02:06:34

标签: c gcc

我正在写一个素数查找器。在数学上,它更快,而不是做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 <math.h>
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

将“number”的类型更改为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.
                         ^

加上另一个警告。

2 个答案:

答案 0 :(得分:11)

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

 gcc -x c main.c -lm 

您可以看到实例here,示例中有三个命令行。一个没有-lm,一个-lm之前需要-l的文件需要它一个。

为了完整起见,如果我们引用gcc docs on options for Linking,则会为{{1}}说明以下内容:

  

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

答案 1 :(得分:1)

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

相关问题