静态库、动态库与导入库详解
跳转到“静态库、动态库与导入库详解”核心概念
跳转到“核心概念”| 类型 | 定义 | 文件扩展名 | 链接方式 | 运行时依赖 |
|---|---|---|---|---|
| 静态库 | 预编译代码集合,编译时嵌入可执行文件 | .lib (Windows)、.a (Linux/MinGW) | 直接链接到可执行文件 | 无 |
| 动态库 | 运行时加载的代码库,允许多程序共享 | .dll (Windows)、.so (Linux) | 运行时动态加载 | 需动态库文件 |
| 导入库 | 辅助链接器定位动态库符号的元数据文件(仅Windows) | .lib (MSVC)、.dll.a (MinGW) | 提供符号信息,无实际代码 | 需动态库文件 |
跨平台对比
跳转到“跨平台对比”Windows 系统
跳转到“Windows 系统”-
静态库
- 生成(MSVC):
终端窗口 cl /c mylib.c # 生成.objlib /out:mylib.lib mylib.obj # 生成.lib静态库 - 生成(MinGW):
终端窗口 gcc -c mylib.c -o mylib.o # 生成.oar rcs libmylib.a mylib.o # 生成.a静态库 - 使用: 直接链接到可执行文件,无需运行时文件。
- 生成(MSVC):
-
动态库
- 生成(MSVC):
终端窗口 cl /LD mylib.c /Fe:mylib.dll # 生成.dll和.lib导入库 - 生成(MinGW):
终端窗口 gcc -shared -o mylib.dll mylib.o -Wl,--out-implib,libmylib.dll.a - 使用: 链接对应的导入库(
.lib或.dll.a),运行时需mylib.dll在PATH或同级目录。
- 生成(MSVC):
-
导入库
- MSVC生成
.lib,MinGW生成.dll.a。仅用于编译时符号解析,不含实际代码。
- MSVC生成
Linux 系统
跳转到“Linux 系统”-
静态库
- 生成:
终端窗口 gcc -c mylib.c -o mylib.oar rcs libmylib.a mylib.o - 使用: 直接链接,生成独立可执行文件。
- 生成:
-
动态库
- 生成:
终端窗口 gcc -fPIC -c mylib.c # 位置无关代码gcc -shared -o libmylib.so mylib.o - 使用: 编译时链接
.so,运行时需设置LD_LIBRARY_PATH或标准库路径。
- 生成:
关键区别
跳转到“关键区别”| 特性 | 静态库 | 动态库 | 导入库(Windows) |
|---|---|---|---|
| 内容 | 实际代码 | 实际代码 | 符号信息(无代码) |
| 链接时机 | 编译时嵌入 | 运行时加载 | 编译时符号解析 |
| 文件体积 | 增大可执行文件 | 可执行文件较小 | 很小(仅符号表) |
| 多进程共享 | 否 | 是 | 依赖动态库共享 |
| 更新维护 | 需重新编译程序 | 替换动态库即可 | 需更新动态库 |
CMake 配置示例
跳转到“CMake 配置示例”Windows(MSVC)
跳转到“Windows(MSVC)”# 链接导入库target_link_libraries(myapp PRIVATE mylib.lib)
# 运行时自动复制.dll到输出目录add_custom_command(TARGET myapp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/libs/mylib.dll" $<TARGET_FILE_DIR:myapp>)Linux/MinGW
跳转到“Linux/MinGW”# 链接动态库target_link_libraries(myapp PRIVATE mylib)
# 设置运行时库路径(可选)set(CMAKE_INSTALL_RPATH "$ORIGIN")常见问题
跳转到“常见问题”-
Windows下MinGW生成的导入库是
.dll.a还是.lib?- MinGW生成
.dll和对应的.dll.a(导入库),而MSVC生成.dll和.lib。
- MinGW生成
-
Linux是否需要导入库?
- 不需要,直接通过
.so文件在编译时指定-l选项即可。
- 不需要,直接通过
-
如何区分静态库和导入库(均为.lib)?
- 在Windows下,若同时存在同名
.lib和.dll,则.lib为导入库;若仅有.lib且无可执行代码依赖,则为静态库。
- 在Windows下,若同时存在同名
总结
跳转到“总结”- 静态库:适合代码独立、无频繁更新的场景,避免外部依赖。
- 动态库:优化内存使用,支持热更新,需管理运行时路径。
- 导入库:Windows特有机制,桥接编译与运行时依赖。
来源:CSDN 原文,首次发布于 2025-03-18。