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

时间:2011-12-03 13:13:59

标签: linux linker ld

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

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

3 个答案:

答案 0 :(得分:5)

来自“An Introduction to GCC - for the GNU compilers gcc and g++

  

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

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

答案 1 :(得分:5)

一个简单的例子可以让你了解为什么单通道Unix链接器关心订单。

假设你有main.o(由main.cpp生成)和库libx.a(没有依赖项)和 liby.a(取决于libx,名为newRefX)

如果链接器按此顺序排列,则链接器从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
  4. 但是如果链接器按此顺序排列,则会遇到newRefX的问题:

    1. main.o refX = undef,refY = undef
    2. libx.a refX = def,refY = undef,
    3. liby.a refX = def,refY = def, newRefX = undef
    4. 所以,你可以看到你想要最低级别的库(不依赖于其他库的库)。

答案 2 :(得分:2)

这是Unix链接器的工作方式,因为很久以前......见Levine's book