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编译器设置中链接了-lm
: gcc -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()时,它不能内联它的值,因为它的值只会是在运行时知道,因此你需要探索链接标准数学库,而不是内联值,它将调用函数。