VIP8
本课程属于:050-重构、设计与代码质量工程 后端、数据与云原生工程 · 共 8 门相关课程,组合学习更完整。
查看所属VIP全部课程 →
← 返回所属目录 咨询 / 购买

库链接问题调试实战课程

📚 共计 30 章节
01
链接的本质:从源代码到可执行文件
编译、汇编、链接三阶段,静态链接与动态链接的核心区别。
基础核心概念
02
库文件探秘
静态库(.a/.lib)与动态库(.so/.dll/.dylib)创建、命名规则、内部结构。
库结构符号表
03
链接器的工作机制
符号解析与重定位,强/弱符号,多重定义规则,COMMON块。
链接器符号
04
链接顺序的陷阱
库顺序为何重要?单遍/多遍扫描,GNU ld与MSVC link差异。
顺序陷阱
05
未定义引用 (undefined reference)
根本原因分析:忘记链接、拼写、库顺序、C++名字改编,系统化排查。
错误调试
06
重复定义 (multiple definition)
产生场景:头文件定义、重复链接;解决方案:static/inline/extern/weak。
冲突解决
07
符号隐藏与可见性
static、-fvisibility=hidden、dllexport/dllimport,为何隐藏符号。
符号可见性
08
动态库运行时加载
dlopen/dlsym (Linux),LoadLibrary/GetProcAddress (Windows),动态绑定。
运行时加载
09
动态库搜索路径
LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, PATH, rpath与runpath。
路径环境变量
10
动态库版本管理
SONAME机制,符号版本化,向后兼容,版本冲突问题。
版本兼容
11
C++名字改编 (Name Mangling)
GCC与MSVC改编规则,extern "C"作用,混合语言链接注意事项。
C++ABI
12
ABI兼容性
什么是ABI,破坏ABI的操作,如何保持ABI稳定。
ABI稳定
13
循环依赖
静态/动态库循环依赖,解决方案:重构、合并库、dlopen。
依赖重构
14
链接器脚本 (Linker Script)
GNU ld链接脚本基础,控制内存布局,自定义段,嵌入式应用。
脚本嵌入式
15
弱符号与弱引用
__attribute__((weak)),弱引用应用:回调、插件、功能检测。
弱符号插件
16
库的剥离与优化
strip命令,去除调试信息,LTO,减小库体积实战技巧。
优化体积
17
交叉编译中的链接问题
目标与主机差异,sysroot,交叉编译工具链链接配置。
交叉编译工具链
18
大型项目中的链接管理
CMake target_link_libraries,Bazel deps,依赖图可视化,增量链接。
构建CMake
19
调试工具链(上)
ldd (Linux),otool (macOS),dumpbin (Windows),查看依赖与符号。
工具依赖
20
调试工具链(下)
nm, objdump, readelf, strings,深入分析库文件内容。
分析库文件
21
链接时间分析
--trace, --verbose, -Wl,--print-map,理解链接器行为。
分析链接器
22
内存泄漏与库
动态库卸载资源清理,全局对象析构顺序,Valgrind/ASan检测。
内存泄漏
23
插件系统设计
基于动态库的插件架构,接口定义,安全加载/卸载,版本协商。
插件架构
24
Windows DLL 专题
DLL入口点(DllMain),线程附加/分离,延迟加载,DLL地狱。
WindowsDLL
25
macOS 框架与库
Framework结构,@rpath, @executable_path, @loader_path,通用二进制。
macOSFramework
26
链接与安全
RPATH注入攻击,库劫持,加固:签名、校验、隐藏符号。
安全加固
27
构建系统集成
Makefile链接配置,Autotools libtool,Meson依赖管理。
构建集成
28
容器与链接
Docker镜像库依赖管理,多阶段构建,Alpine与glibc/musl差异。
容器Docker
29
实战案例(一)
解决真实“undefined reference to”问题,从报错到修复心路历程。
实战案例
30
实战案例(二)
解决真实“动态库加载失败”问题,排查依赖、路径、版本冲突。
实战加载失败