0

我正在尝试编写一个程序来近似 pi。它基本上取 0.00 到 1.00 之间的随机点并将它们与圆的边界进行比较,圆内的点与总点的比率应该接近 pi(一个非常快速的解释,规范更深入)。

但是,使用 gcc 编译时出现以下错误:

Undefined                       first referenced
symbol                          in file
pow                             /var/tmp//cc6gSbfE.o
ld: fatal: symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

这是怎么回事?我以前从未见过此错误,也不知道为什么会出现此错误。这是我的代码(虽然我没有完全测试它,因为我无法克服错误):

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void) {
    float x, y;
    float coordSquared;
    float coordRoot;
    float ratio;
    int n;
    int count;
    int i;

    printf("Enter number of points: ");
    scanf("%d", &n);

    srand(time(0));

    for (i = 0; i < n; i++) {
        x = rand();
        y = rand();

        coordSquared = pow(x, 2) + pow(y, 2);
        coordRoot = pow(coordSquared, 0.5);

        if ((x < coordRoot) && (y < coordRoot)) {
            count++;
        }
    }

    ratio = count / n;
    ratio = ratio * 4;

    printf("Pi is approximately %f", ratio);

    return 0;
}
4

3 回答 3

6

在编译(或链接)期间使用-lm以包含数学库。

像这样:gcc yourFile.c -o yourfile -lm

于 2012-11-07T05:40:13.257 回答
3

需要与 -lm 链接。gcc test.c -o 测试 -lm

于 2012-11-07T05:53:44.250 回答
2

错误是由链接器产生的,ld. 它告诉您pow找不到符号(在链接器处理的所有目标文件中未定义)。解决方案是包含包含pow()函数实现的库,libm(m 表示数学)。[1] 将-lm开关添加到编译器命令行调用(在所有源文件规范之后)以执行此操作,例如

gcc -o a.out source.c -lm

[1] 或者,您可以在单独的翻译单元或库中拥有自己的实现pow(),但您仍然必须告诉编译器/链接器在哪里可以找到它。

于 2012-11-07T05:42:48.267 回答