我有两段代码,除了一行外都是相同的。一个程序无法编译,另一个程序成功。当我执行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
这让我感觉有点愚蠢,或者至少感觉我多年来错过了什么。
答案 0 :(得分:1)
您没有与数学库链接。如果您使用gcc
,则需要在最后传递-lm
。
那么为什么第一个例子有效呢?我可以推测这种情况正在发生,因为你直接在双字面上调用sin
而gcc
可以自己做魔法而不需要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