-lm不起作用,除非它在命令的末尾

时间:2017-10-13 03:50:36

标签: c gcc math.h

我目前正在为一个单一的评估编写一个程序,并且他们有一个设定线来编译它,所以如果它没有使用它,它就不会被接受。 他们命令他们使用

gcc -Wall -ansi -lm program.c -o program.out

我的程序不会以这种方式编译,并且它会给我一个未定义的referance错误(使用math.h库参考我的log10) 如果我使用:

gcc -Wall -ansi program.c -o program.out -lm

它有效

可能是我的问题?

我使用Windows 10 64bit并安装了Windows bash和gcc。

2 个答案:

答案 0 :(得分:2)

如果你的导师使用的是黄金并且你正在使用GNU ld,这将被解释。这两个链接器都是GNU项目的一部分,两者都常用于GCC。

如果您使用的是GNU ld,那么您将获得传统的"行为:

  

指定-L和-l选项的顺序以及指定-l选项相对于路径名操作数的顺序非常重要。

这意味着您必须在之后放置-lm 任何依赖于它的对象文件和库。

但是,如果您使用黄金,-l选项可能会首先出现。

如果您的系统上安装了金牌,您可以自行测试。

这是我得到的:

$ gcc -lm program.c 
/tmp/ccJmBjmd.o: In function `main':
program.c:(.text+0x15): undefined reference to `sin'
collect2: error: ld returned 1 exit status

但如果我使用黄金,它可以正常工作:

$ gcc -lm program.c -fuse-ld=gold

答案 1 :(得分:0)

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

  

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