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

结论:

  • 库的顺序很重要,依赖的库要放在被依赖库的后面。
  • 链接器只会向后查找库,不会回头查找已经处理过的库。
相关推荐
披着假发的程序唐2 分钟前
STM32 H743 MPU的配置使用方法
linux·c语言·c++·驱动开发·stm32·单片机·mcu
小此方4 分钟前
Re:Linux系统篇(十二)工具篇 · 四:make与Makefile:高效管理 C++ 工程项目构建
linux·运维·c++·开发工具
云小逸11 分钟前
【Codex 使用教程:从项目规则、Skills、Rules 到 Hooks】
c++·人工智能·ai·codex
li星野11 分钟前
二叉树十题通关:从层序遍历到序列化(Python + C++)
开发语言·c++·python·学习
王老师青少年编程13 分钟前
csp信奥赛C++高频考点专项训练之字符串 --【回文字符串】:最大回文数
c++·字符串·csp·高频考点·信奥赛·回文字符串·最大回文数
邪修king1 小时前
UE5 进阶篇第一弹:中期架构升级 —— 组件化开发与 Gameplay 框架实战
c++·游戏·架构·ue5
知识领航员10 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
jf加菲猫12 小时前
第21章 Qt WebEngine
开发语言·c++·qt·ui
码农-阿杰13 小时前
深入理解 synchronized 底层实现:从 HotSpot C++ 源码看对象锁与 Monitor 机制
开发语言·c++·
Szime13 小时前
深智微IC华润微代理:MCU选型与工业控制方案推荐
c++