1

我正在尝试在 C 中执行一个非常简单的代码:

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

#ifndef M_PI
 #define M_PI 3.14
#endif 

double cosrad (double n)
{
    double rad = n*(M_PI)/180.0;
    double res = cos(rad);
    return res;
}

int main (int argc, char** argv)
{
    printf ("cosrad 90 = %f\n", cosrad(90));
    printf ("cos pi/2 = %f\n", cos(M_PI/2.0));
    return 0;
}

但是在使用此命令行(使用-lm)进行编译时,出现错误。似乎找不到数学库。

$gcc -Wall -Werror -std=c99 -O0 -lm -g -o foo foo.c
.c:12: undefined reference to `cos'
collect2: ld a retourné 1 code d'état d'exécution

这真的很奇怪,因为代码:

 printf ("cos pi/2 = %f\n", cos(M_PI/2.0));

(没有 cosrad 功能)效果很好!

有人可能有解决这个问题的想法吗?

谢谢

4

3 回答 3

8

您需要将该-lm选项放在需要它的文件 (foo.c) 之后。IE:

gcc -Wall -Werror -std=c99 -O0 -g -o foo foo.c -lm

链接时指定的模块顺序很重要:您需要在引用它的模块之后放置一个模块。

确实起作用的原因cos(M_PI/2.0)可能是编译器在这种情况下用常量替换了该值,因此cos不需要链接到该函数。

于 2013-05-12T15:11:27.927 回答
-1

我认为你的问题在于printf ("cosrad 90 = %f\n", cosrad(90));
cosrad被定义double/float为参数,但在这里它的发现int 价值。
类型转换到double/float将有助于消除这个问题。

祝你好运。

于 2013-05-12T15:12:59.537 回答
-2

使用 gcc 编译时必须显式链接数学库,但要小心:math.h 充满了错误和危险函数

于 2013-05-12T15:29:40.923 回答