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

我有一小段代码:

#include  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" ,所以我不确定错误的来源是什么。 我不做什么?

-lm放在命令行的末尾。

您的-lm选项不起作用,因为它需要遵循命令行上的输入源:

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

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

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

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