我有一小段代码:
#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编译器设置中链接了-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"
,所以我不确定错误的来源是什么。我不是在做什么?
答案 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()时,它不能内联它的值,因为它的值只有在运行时才能知道,因此你需要灵活地链接标准数学库,而不是内联值,它将调用函数。