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() 未定义。

结论:

  • 库的顺序很重要,依赖的库要放在被依赖库的后面。
  • 链接器只会向后查找库,不会回头查找已经处理过的库。
相关推荐
hold?fish:palm41 分钟前
9 找到字符串中所有字母异位词
c++·算法·leetcode
啦啦啦啦啦zzzz2 小时前
算法:回溯算法
c++·算法·leetcode
Lzg_na2 小时前
订阅发布模块事例
c++
郝学胜-神的一滴2 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
汉克老师2 小时前
2026年CSP-J初赛分数线-----预测
c++·csp-j·小学生·学c++编程
脱胎换骨-军哥2 小时前
C++数据库存储引擎内核开发:B+树索引与MVCC并发控制的完整实现
数据库·c++·b树
小保CPP3 小时前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
乐观勇敢坚强的老彭4 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光4 小时前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
王维同学4 小时前
[原创][Windows C++]Explorer Shell 扩展、图标覆盖与 COM 服务器定位
c++·windows·注册表