通常,我会编译一个需要特定库的程序,例如:数学,通过在需要它的源之后传递链接器标志,如下所示:
gcc foo.c -lm
然而,似乎旧版本的gcc与反向顺序同样有效(让我们称之为 BAD ORDER ):
gcc -lm foo.c
如果我尝试编译的一些流行的开源项目在我的gcc
版本(或者是{{ld
时没有使用后者,我不会担心1}}问题是什么?)只在前一种情况下工作(在我看来也是正确的)。
我的问题是: BAD ORDER 什么时候停止工作?为什么?似乎不支持它打破了传统的包。
答案 0 :(得分:3)
什么时候BAD ORDER停止工作?为什么?似乎不支持它打破了传统的包。
:当吗
不确定,但我认为在GCC之前4.5。很久以前。随后,--as-needed
选项默认为共享库操作,
与静态库一样,它们必须晚于链接序列,而不是它们提供定义的对象。
这是gcc/g++/gfortran
等工具驱动程序传递给ld
的默认选项的更改。
<强>为什么吗
对于不熟练的用户来说,默认情况下必须出现静态库
后来默认情况下共享库时它们提供定义的对象
不是 - 两者之间的差异通常被-l<name>
约定隐藏
用于链接libname.a
或libname.so
。
这可能是一个不可预见的后果,不熟练的用户 以前在海湾合作委员会的错误信念上有很多运气 [compile and] link命令符合正常的Unix模式:
command [OPTION...] FILE [FILE...]
e.g。
gcc -lthis -lthat -o prog foo.o bar.o
现在它的情况要糟糕得多。