2

我有一小段代码:

#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;
}

我已经-lm在我的 Eclipse 编译器设置中链接: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",所以我不确定错误的来源是什么。我没有正确地做什么?

4

3 回答 3

8

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

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

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

于 2013-05-28T22:10:48.873 回答
7

放在-lm命令行末尾。

于 2013-05-28T22:07:06.167 回答
0

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

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

于 2013-05-29T16:35:33.427 回答