gcc似乎找不到数学库

时间:2013-05-12 15:02:50

标签: c math gcc

我正在尝试在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功能)效果很好!

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

由于

3 个答案:

答案 0 :(得分:8)

您需要将<{1}}选项放在需要它的文件之后(foo.c)。即:

-lm

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

gcc -Wall -Werror -std=c99 -O0 -g -o foo foo.c -lm 确实起作用的原因可能是编译器在这种情况下用常量替换了值,因此不需要链接到cos(M_PI/2.0)函数。

答案 1 :(得分:-1)

我认为你的问题在于printf ("cosrad 90 = %f\n", cosrad(90));
cosrad被定义为将double/float作为参数,但在此处查找int 值。
double/float进行类型转换将有助于消除此问题。

祝你好运。

答案 2 :(得分:-2)

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