我正在尝试在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功能)效果很好!
有人可能有想法解决这个问题吗?
由于
答案 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充满错误和危险函数