MSVC 链接器处理input file的逻辑

举例说明这个 caveat:

假设你有两个库:libA.liblibB.lib,它们都定义了一些符号,并且 libA.lib 依赖于 libB.lib 中的某些符号。

比如:

  • libA.lib 里有一个对象文件 A.obj,它用到了 foo(),而 foo() 的实现只在 libB.lib 里。

  • 你用如下顺序链接:

    LINK.EXE main.obj libA.lib libB.lib

链接过程:

  1. main.obj 先被处理,假设它引用了 A.obj 里的某个函数。
  2. 链接器处理 libA.lib,发现 A.obj 需要 foo(),但此时 foo() 还未解析。
  3. 链接器会在 libA.lib 里找 foo(),找不到,就继续往后找,在 libB.lib 里找到了 foo(),于是解析成功。

但如果你换个顺序:

复制代码
LINK.EXE main.obj libB.lib libA.lib
  1. 处理 main.obj,没有 foo() 的引用。
  2. 处理 libB.lib,没有需要解析的符号。
  3. 处理 libA.lib,发现需要 foo(),但链接器只会在 libA.lib 及其后面的库里找,而 libB.lib 已经处理过了,不会回头再查找。
  4. 结果:链接失败,提示 foo() 未定义。

结论:

  • 库的顺序很重要,依赖的库要放在被依赖库的后面。
  • 链接器只会向后查找库,不会回头查找已经处理过的库。
相关推荐
hetao17338375 小时前
2025-12-12~14 hetao1733837的刷题笔记
数据结构·c++·笔记·算法
椰子今天很可爱5 小时前
五种I/O模型与多路转接
linux·c语言·c++
程序员zgh5 小时前
C++ 互斥锁、读写锁、原子操作、条件变量
c语言·开发语言·jvm·c++
獭.獭.7 小时前
C++ -- STL【unordered_set和unordered_map的使用】
c++·stl·unordered_map·unordered_set
star _chen8 小时前
C++ std::move()详解:从小白到高手
开发语言·c++
福尔摩斯张9 小时前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法
charlie1145141919 小时前
如何快速在 VS2026 上使用 C++ 模块 — 完整上手指南
开发语言·c++·笔记·学习·现代c++
报错小能手10 小时前
STL_unordered_map
开发语言·c++·哈希算法
历程里程碑10 小时前
C++ 9 stack_queue:数据结构的核心奥秘
java·开发语言·数据结构·c++·windows·笔记·算法
仰泳的熊猫10 小时前
1108 Finding Average
数据结构·c++·算法·pat考试