为什么指定input库的顺序很重要?

我对Linux编程相当陌生。 你可以说我是一个Windows的家伙。 所以,我把我的项目移植到了Linux上,它几乎让我疯了:我确定我已经用-l标志指定了所有的依赖关系,但是我得到了“未解决的符号”错误。 然后我发现了这个话题,它解决了我的问题: 在Linux上使用GCC连接

有人可以解释一下为什么这个命令很重要,它究竟有多重要? 我很确定这不是MSVC链接器的情况下…

一个简单的例子可以让你明白为什么一次通过的Unix链接器关心顺序。

假设你有main.o(由main.cpp生成)和库libx.a(不依赖)和liby.a(依赖于叫做newRefX的libx)

如果链接器按照这个顺序进行,那么链接器从1到3就可以了:

  1. main.o refX = undef,refY = undef
  2. liby.a refX = undef,refY = def, newRefX = undef
  3. libx.a refX = def,refY = def, newRefX = def

但是,如果链接程序按照这个顺序进行,则会遇到newRefX的问题:

  1. main.o refX = undef,refY = undef
  2. libx.a refX = def,refY = undef,
  3. liby.a refX = def,refY = def, newRefX = undef

所以,你可以看到你想要最底层的库(不依赖于别人的库)。

从“ GCC介绍 – GNU编译器gcc和g ++ ”

链接器的传统行为是在命令行指定的库中从左向右搜索外部函数。 这意味着包含函数定义的库应该出现在任何使用它的源文件或目标文件之后。

我相信,msvc连接器做2代码,所以他们可能能够解析符号,即使库指定不同的顺序(引用丢失…)

这是Unix连接器的工作方式,很久以前…见Levine的书