math.h链接器错误在C中使用sin()

时间:2013-10-04 18:51:21

标签: c linker type-conversion math.h

我有两段代码,除了一行外都是相同的。一个程序无法编译,另一个程序成功。当我执行cc编译代码时,我会链接数学库。

我正在使用double sin(double)功能。它显然是在math.h中定义的,虽然我查看了/usr/include/math.h并且没有找到sin()函数的引用。

请参阅http://www.gnu.org/software/libc/manual/html_mono/libc.html#Trig-Functions

sin()函数在我给出的一个代码段中起作用,但在另一个代码段中起作用。

//Successful program - demo1.c
#include <stdio.h>
#include <math.h>

int main (void)
{
    double input, sine_A; 
    input = 6.2830;
    sine_A = sin(6.2830);
    printf("sine=%f\n",sine_A);
    return 0;
}

这是失败的计划:

//Failed program - demo2.c
#include <stdio.h>
#include <math.h>

int main (void)
{
    double input, sine_A;
    input = 6.2830;
    sine_A = sin(input);
    printf("sine=%f\n",sine_A);
    return 0;
}

$ cc -lm demo2.c

/tmp/ccnpIWZd.o: In function `main':
demo2.c:(.text+0x1c): undefined reference to `sin'
collect2: ld returned 1 exit status

这让我感觉有点愚蠢,或者至少感觉我多年来错过了什么。

2 个答案:

答案 0 :(得分:1)

您没有与数学库链接。如果您使用gcc,则需要在最后传递-lm

那么为什么第一个例子有效呢?我可以推测这种情况正在发生,因为你直接在双字面上调用singcc可以自己做魔法而不需要libm - 它可以直接计算它并完全用结果替换调用。 / p>

答案 1 :(得分:0)

-lm需要在命令的末尾,很可能在第一种情况下,文件编译器正在优化对sin的调用,因此不需要链接到库。这称为constant folding,例如我们可以在Other Built-in Functions Provided by GCC上的gcc文档中看到(强调我的):

  

GCC包含了许多功能的内置版本   标准C库。始终以__builtin_为前缀的版本   被视为具有与C库函数相同的含义,即使   您指定-fno-builtin选项。 (参见C方言选项)许多   这些功能仅在某些情况下得到优化; 如果他们不是   在特定情况下优化,调用库函数是   射出。

以下是live demo我们可以在文字案例gcc中从汇编中看到,优化了对sin的调用,此demo显示了非文字案例我们在集会中看到了:

call    sin