linux - 为什么指定输入库的顺序很重要?

标签 linux linker ld

我对 Linux 编程还很陌生。你可以说我是一个 Windows 人。所以,我将我的项目移植到 Linux,这几乎让我发疯:我确定我已经用 -l 标志指定了所有依赖项,但我却收到“未解析的符号”错误。 然后我找到了这个主题,它解决了我的问题:Boost linking on Linux with 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

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

关于linux - 为什么指定输入库的顺序很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8367888/

相关文章:

ruby - S3 : my multi-part uploader doesn't work for files > 5GB

linux - 如何将 Linux 内核交叉编译为 MIPS 小端主机?

c++ - expat 对 `XML_SetElementHandler' 的 undefined reference

visual-c++ - _imp 和 __imp 有什么区别?

c++ - GCC 链接器找不到标准库?

c++ - 您将如何列出已编译库中包含的可用函数等?

c++ - llvm-ld 仍然存在于 clang 3.4 吗?

linux - 如何避免在 perl 脚本中硬编码用户名/密码

linux - 在 Unix 上连接文本文件中的多个字段

c++ - 您如何将所有链接依赖项打包到一个 Linux 静态库中?