链接库
静态库和动态库
编译
: 对源文件做词法分析、语法分析、语义分析等操作,最终生成多个目标文件(二进制文件中会有一个main函数的标识符)
链接
: 对于各个目标文件中缺失的函数和变量的存储地址(后续简称“缺失的地址”),由链接器负责修复,并最终将所有的目标文件和链接库组织成一个可执行文件
库文件
重复使用的代码块
链接库
是二进制文件,但无法独立运行,必须等待其它程序调用,才会被载入内存
hello.cpp这样的"开源"的库文件很难找到,多数程序员并不会直接分享源代码,他们更愿意分享库文件的二进制版本——链接库
链接器可以在两个地方起作用: 编译和运行阶段
静态链接库
无论缺失的地址在目标文件中还是链接库中, 链接器都逐个找到它们, 然后生成整个可执行文件, 这个可执行文件可以独立载入内存. 链接的这些链接库, 叫做静态链接库
动态链接库
链接器先从所有目标文件中找到一部分缺失的地址, 生成可执行文件. 此时仍缺失部分函数和变量的地址, 代文件执行时, 需连同剩余的的链接库文件一起载入内存, 再由链接器修复剩余缺失的地址. 这些剩余的链接库叫做动态链接库.
静态库 | 动态库 | |
---|---|---|
编译时链接到可执行文件中 | 运行时链接 | |
Linux中 | .a | .so |
Windows | .lib | .dll |
每一个可执行文件一份 | 一份, 可共用 |
依赖管理
这样,使用者C只需要把A的include文件夹设置为include directory,便可以使用A库所提供的功能了
如果引用src中的东西, 容易造成代码混乱. 引用include能够避免.
A --
|--src
|--A.h
|--A.cpp
|--include
|--A.h
B --
|--include
|--B.h
include中代码, 引用真正的 A.h
#include "../src/A.h"