C的pow()不适用于变量指数

时间:2013-05-28 22:05:30

标签: c pow

我有一小段代码:

#include <math.h>

int main(void){
    pow(2.0,7.0);
    //Works

    double x = 3.0;
    pow(2.0,x);
    //Fails with error "undefined reference to 'pow'"
    return 0;
}

我在Eclipse编译器设置中链接了-lmgcc -O0 -g3 -Wall -lm -c -fmessage-length=0 -MMD -MP -MF"src/pgm.d" -MT"src/pgm.d" -o "src/pgm.o" "../src/pgm.c",所以我不确定错误的来源是什么。我不是在做什么?

3 个答案:

答案 0 :(得分:8)

您的-lm选项不起作用,因为it needs to follow命令行上的输入源:

  

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

第一个pow(2.0,7.0)有效,因为它被编译器评估为常量表达式,并且在运行时不需要pow

答案 1 :(得分:7)

-lm放在命令行的末尾。

答案 2 :(得分:0)

您需要使用编译器的-lm标志链接到数学库。

第一个例子是有效的,因为编译器可以内联值(实际上,2 ^ 7总是等于128),但是当使用变量参数来表示pow()时,它不能内联它的值,因为它的值只有在运行时才能知道,因此你需要灵活地链接标准数学库,而不是内联值,它将调用函数。