为什么指定哪个输入库很重要?

Vio*_*ffe 1 linux linker ld

我对Linux编程很陌生.你可以说我是一个Windows家伙.所以,我把我的项目移植到Linux,它几乎让我疯了:我确定我已经用-l标志指定了所有依赖项,但是我得到了"未解决的符号"错误.然后我找到了这个主题,它解决了我的问题:在Linux上加强与GCC的连接

有人可以解释一下,为什么订单很重要,以及它究竟有多重要?我很确定MSVC链接器的情况并非如此......

ste*_*anB 5

从" GCC简介 - 用于GNU编译器gcc和g ++ "

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

我相信msvc链接器会对代码执行2次传递,因此即使以不同的顺序指定库(参考缺失...),它们也可以解析符号.


kfm*_*e04 5

一个简单的例子可以让你了解为什么单通道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

因此,您可以看到最后需要最低级别的库(不依赖于其他库).