链接错误 - gcc -lm [英] Linking error - gcc -lm

查看:148
本文介绍了链接错误 - 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆