链接错误 - gcc -lm [英] Linking error - gcc -lm
问题描述
我编译并链接到 gcc -lm -o无用useless.c
以下无用的代码片段:
/ *文件useless.c * /
#include< stdio.h>
#include< math.h>
int main()
{
int sample =(int)(0.75 * 32768.0 * sin(2 * 3.14 * 440 *((float)1/44100)));
return(0);
}
到目前为止这么好。但是,当我改变为:
/ *文件useless.c * /
#include ;
#include< math.h>
int main()
{
int freq = 440;
int sample =(int)(0.75 * 32768.0 * sin(2 * 3.14 * freq *((float)1/44100)));
return(0);
}
我尝试使用相同的命令行编译gcc响应:
/tmp/cctM0k56.o:函数`main':
ao_example3.c :(。text + 0x29):undefined引用'sin'
collect2:ld返回1退出状态
并停止。发生什么事?为什么我不能这样编译?
我也尝试了一个 sudo ldconfig -v
,但没有成功。 p>
感谢提前!
Lucas。
对于第一个示例,编译器不会生成对罪
。它认为参数是一个常量表达式,所以它用表达式的结果替换 sin(...)
调用,并且不需要数学库。没有 -lm
就可以工作。 (但是你不应该指望这一点,编译器会执行这种优化的时候并不总是显而易见的。)
(如果编译
gcc -S useless.c
并查看 useless.s
,生成的汇编语言列表中,您可以看到没有调用<$ c $对于第二个例子,你确实需要 -lm
。
useless.c
)之后: gcc -o无用的无用的c -lm
或
gcc useless.c -lm -o无用
链接器按顺序处理文件,跟踪每个文件的未解析符号( sin
,由 useless.o
)引用,然后在看到它们的定义时解析它们。如果首先放置 -lm
,则在处理数学库时不会有未解析的符号;当它在 useless.o
中看到对 sin
的调用时,就已经太晚了。
Well, I think my problem is a little bit interesting and I want to understand what's happening in my Ubuntu box.
I compiled and linked with gcc -lm -o useless useless.c
the following useless piece of code:
/*File useless.c*/
#include <stdio.h>
#include <math.h>
int main()
{
int sample = (int)(0.75 * 32768.0 * sin(2 * 3.14 * 440 * ((float) 1/44100)));
return(0);
}
So far so good. But when I change to this:
/*File useless.c*/
#include <stdio.h>
#include <math.h>
int main()
{
int freq = 440;
int sample = (int)(0.75 * 32768.0 * sin(2 * 3.14 * freq * ((float) 1/44100)));
return(0);
}
And I try to compile using same command line, gcc responses:
/tmp/cctM0k56.o: In function `main':
ao_example3.c:(.text+0x29): undefined reference to `sin'
collect2: ld returned 1 exit status
And stops. What is happening? Why I can't compile that way?
I tried also a sudo ldconfig -v
without success.
Thanks in Advance!
Lucas.
There are two different things going on here.
For the first example, the compiler doesn't generate a call to sin
. It sees that the argument is a constant expression, so it replaces the sin(...)
call with the result of the expression, and the math library isn't needed. It will work just as well without the -lm
. (But you shouldn't count on that; it's not always obvious when the compiler will perform this kind of optimization and when it won't.)
(If you compile with
gcc -S useless.c
and take a look at useless.s
, the generated assembly language listing, you can see that there's no call to sin
.)
For the second example, you do need the -lm
option -- but it needs to be at the end of the command line, or at least after the file (useless.c
) that needs it:
gcc -o useless useless.c -lm
or
gcc useless.c -lm -o useless
The linker processes files in order, keeping track of unresolved symbols for each one (sin
, referred to by useless.o
), and then resolving them as it sees their definitions. If you put the -lm
first, there are no unresolved symbols when it processes the math library; by the time it sees the call to sin
in useless.o
, it's too late.
这篇关于链接错误 - gcc -lm的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!