gcc中链接器标志的正确顺序是什么?

时间:2016-03-09 16:32:37

标签: gcc linker

通常,我会编译一个需要特定库的程序,例如:数学,通过在需要它的源之后传递链接器标志,如下所示:

gcc foo.c -lm

然而,似乎旧版本的gcc与反向顺序同样有效(让我们称之为 BAD ORDER ):

gcc -lm foo.c

如果我尝试编译的一些流行的开源项目在我的gcc版本(或者是{{ld时没有使用后者,我不会担心1}}问题是什么?)只在前一种情况下工作(在我看来也是正确的)。

我的问题是: BAD ORDER 什么时候停止工作?为什么?似乎不支持它打破了传统的包。

1 个答案:

答案 0 :(得分:3)

  

什么时候BAD ORDER停止工作?为什么?似乎不支持它打破了传统的包。

:当吗

不确定,但我认为在GCC之前4.5。很久以前。随后,--as-needed选项默认为共享库操作, 与静态库一样,它们必须晚于链接序列,而不是它们提供定义的对象。 这是gcc/g++/gfortran等工具驱动程序传递给ld的默认选项的更改。

<强>为什么吗

对于不熟练的用户来说,默认情况下必须出现静态库 后来默认情况下共享库时它们提供定义的对象 不是 - 两者之间的差异通常被-l<name>约定隐藏 用于链接libname.alibname.so

这可能是一个不可预见的后果,不熟练的用户 以前在海湾合作委员会的错误信念上有很多运气 [compile and] link命令符合正常的Unix模式:

command [OPTION...] FILE [FILE...]

e.g。

gcc -lthis -lthat -o prog foo.o bar.o

现在它的情况要糟糕得多。