5、不同平台编译生成的库后缀名详解
约 1204 字大约 4 分钟
2026-03-26
编译生成的库文件根据操作系统、编译器和库类型(静态库/动态库)的不同,会有不同的命名规范和后缀名。
📚 一、静态库后缀名
静态库是在编译时被链接到可执行文件中的库,其内容在链接时完整复制到目标程序中。
| 平台 | 编译器 | 静态库后缀 | 命名格式 | 示例 |
|---|---|---|---|---|
| Windows | MSVC (Visual Studio) | .lib | 库名.lib | liquibook_simple.lib |
| Windows | MinGW (GCC) | .a | lib库名.a | libliquibook_simple.a |
| Windows | Cygwin (GCC) | .a | lib库名.a | libliquibook_simple.a |
| Linux | GCC/Clang | .a | lib库名.a | libliquibook_simple.a |
| macOS | Clang (Apple) | .a | lib库名.a | libliquibook_simple.a |
| Unix | GCC/Clang | .a | lib库名.a | libliquibook_simple.a |
| iOS | Clang | .a | lib库名.a | libliquibook_simple.a |
| Android | NDK (Clang/GCC) | .a | lib库名.a | libliquibook_simple.a |
📝 命名规则说明
Windows (MSVC):静态库直接使用
.lib后缀,不需要lib前缀# 库名: liquibook_simple # 生成文件: liquibook_simple.lib类 Unix 系统(Linux、macOS、MinGW等):静态库使用
.a后缀,需要lib前缀# 库名: liquibook_simple # 生成文件: libliquibook_simple.a
🔄 二、动态库后缀名
动态库是在运行时被加载的库,多个程序可以共享同一个动态库文件。
| 平台 | 编译器 | 动态库后缀 | 命名格式 | 示例 |
|---|---|---|---|---|
| Windows | MSVC | .dll (动态库).lib (导入库) | 库名.dll库名.lib | liquibook_simple.dllliquibook_simple.lib |
| Windows | MinGW | .dll | lib库名.dll | libliquibook_simple.dll |
| Windows | Cygwin | .dll | cyg库名.dll | cygliquibook_simple.dll |
| Linux | GCC/Clang | .so | lib库名.so | libliquibook_simple.so |
| Linux | GCC/Clang | .so.版本号 (带版本) | lib库名.so.主版本.次版本 | libliquibook_simple.so.1.0.0 |
| macOS | Clang | .dylib | lib库名.dylib | libliquibook_simple.dylib |
| macOS | Clang | .framework (框架) | 库名.framework | liquibook_simple.framework |
| iOS | Clang | .framework | 库名.framework | liquibook_simple.framework |
| Android | NDK | .so | lib库名.so | libliquibook_simple.so |
| Unix | GCC/Clang | .so | lib库名.so | libliquibook_simple.so |
📝 命名规则说明
Windows MSVC:
- 动态库文件:
.dll(Dynamic Link Library) - 导入库文件:
.lib(用于链接时解析 DLL 中的符号)
# 库名: liquibook_simple
# 生成文件: liquibook_simple.dll
# 导入库: liquibook_simple.libWindows MinGW:
- 遵循类 Unix 命名规范,使用
lib前缀
# 库名: liquibook_simple
# 生成文件: libliquibook_simple.dllWindows Cygwin:
- 使用
cyg前缀(Cygwin 环境标识)
# 库名: liquibook_simple
# 生成文件: cygliquibook_simple.dllLinux:
- 基本文件名:
lib库名.so - 带版本号:
lib库名.so.主版本.次版本 - 通常还会创建符号链接
# 库名: liquibook_simple
# 实际文件: libliquibook_simple.so.1.0.0
# 符号链接: libliquibook_simple.so.1 → libliquibook_simple.so.1.0.0
# 符号链接: libliquibook_simple.so → libliquibook_simple.so.1macOS:
- 动态库:
.dylib(Dynamic Library) - 框架:
.framework(包含头文件、二进制、资源的打包结构)
# 动态库形式: libliquibook_simple.dylib
# 框架形式: liquibook_simple.framework/📊 三、平台对比总结表
| 平台 | 静态库 | 动态库 | 导入库 | 命名前缀 | 版本管理 |
|---|---|---|---|---|---|
| Windows (MSVC) | .lib | .dll | .lib | 无 | 无(文件名不变) |
| Windows (MinGW) | .a | .dll | - | lib | 无 |
| Linux | .a | .so | - | lib | .so.版本号 |
| macOS | .a | .dylib 或 .framework | - | lib | 版本号在 dylib 内部 |
| FreeBSD | .a | .so | - | lib | .so.版本号 |
| Android | .a | .so | - | lib | 无 |
| iOS | .a | .framework | - | lib | 在 Framework 内部 |
🔧 四、在 MPC 中的处理
MPC 会自动根据目标平台和编译器选择合适的库命名规则。
MPC 项目配置示例
project(liquibook_simple) {
// 同时生成静态库和动态库
staticname = liquibook_simple
sharedname = liquibook_simple
Source_Files {
simple.cpp
}
}不同平台的生成结果:
| 平台/编译器 | 生成的文件 |
|---|---|
| Windows (MSVC) | liquibook_simple.lib (静态)liquibook_simple.dll + liquibook_simple.lib (动态) |
| Windows (MinGW) | libliquibook_simple.a (静态)libliquibook_simple.dll (动态) |
| Linux (GCC) | libliquibook_simple.a (静态)libliquibook_simple.so (动态) |
| macOS (Clang) | libliquibook_simple.a (静态)libliquibook_simple.dylib (动态) |
MPC 中的库引用
在 MPC 中使用 libs 指令时,不需要添加平台特定的前缀和后缀:
project(liquibook) {
// 只需指定库名,MPC 自动处理平台差异
libs += liquibook_simple
// 不需要这样写:
// libs += libliquibook_simple.a (错误)
// libs += liquibook_simple.lib (错误)
}MPC 会自动转换为:
- Linux:
-lliquibook_simple - Windows MSVC:
liquibook_simple.lib - Windows MinGW:
-lliquibook_simple
💡 五、库类型选择建议
| 场景 | 推荐库类型 | 原因 |
|---|---|---|
| 开发阶段 | 动态库 | 编译快,无需重新链接整个程序 |
| 发布版本 | 静态库 | 部署简单,无依赖问题 |
| 大型项目 | 动态库 | 减少可执行文件大小,便于更新 |
| 插件系统 | 动态库 | 支持运行时加载和卸载 |
| 嵌入式系统 | 静态库 | 减少运行时开销 |
| 跨平台项目 | 两者都提供 | 给用户选择权 |
🔍 六、查看库文件信息
Linux/macOS
# 查看动态库信息
file libliquibook_simple.so
ldd libliquibook_simple.so # 查看依赖
nm libliquibook_simple.a # 查看静态库符号
objdump -t libliquibook_simple.a # 详细符号信息Windows
# 查看 DLL 导出函数
dumpbin /EXPORTS liquibook_simple.dll
# 查看 LIB 文件信息
dumpbin /LINKERMEMBER liquibook_simple.lib
# 查看 DLL 依赖
dumpbin /DEPENDENTS liquibook_simple.dll📚 七、快速参考卡
┌─────────────────────────────────────────────────────────────────┐
│ 静态库后缀 │
├─────────────────────────────────────────────────────────────────┤
│ Windows (MSVC) : .lib │
│ Windows (MinGW) : .a │
│ Linux/macOS/*nix: .a │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 动态库后缀 │
├─────────────────────────────────────────────────────────────────┤
│ Windows (MSVC) : .dll + .lib (导入库) │
│ Windows (MinGW) : .dll │
│ Linux : .so │
│ macOS : .dylib 或 .framework │
│ Android : .so │
│ iOS : .framework │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ 命名前缀规则 │
├─────────────────────────────────────────────────────────────────┤
│ Windows (MSVC) : 无前缀 │
│ *nix (GCC/Clang): lib │
│ Windows (Cygwin): cyg │
│ Windows (MinGW) : lib │
└─────────────────────────────────────────────────────────────────┘💡 记忆技巧:类 Unix 系统统一使用
lib库名.后缀格式,Windows MSVC 使用库名.后缀格式(无 lib 前缀)。