我们采用fmt 库的不同编译模式做详细解释:
核心区别
| 特性 | fmt::fmt |
fmt::fmt-header-only |
|---|---|---|
| 库类型 | 预编译的静态库/动态库 | 纯头文件库 |
| 编译时间 | 较快 | 较慢 |
| 执行性能 | 相同 | 相同 |
| 二进制大小 | 较小 | 较大 |
| 依赖管理 | 需要链接库文件 | 只需头文件 |
| 使用便利性 | 需要安装/查找库 | 直接包含即可 |
详细分析
1. fmt::fmt - 预编译库模式
这种方式链接的是已经编译好的 fmt 库二进制文件。
CMakeLists.txt:
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE fmt::fmt)
背后的工作:
- 链接到
libfmt.a(静态库)或libfmt.so(动态库) - 这些库包含了 fmt 的预编译实现
优点:
- ✅ 编译速度快:库代码已经编译好
- ✅ 二进制大小较小:只包含你实际使用的功能
- ✅ 更好的编译期错误检查
缺点:
- ❌ 需要预先安装或编译 fmt 库
- ❌ 可能有 ABI 兼容性问题
2. fmt::fmt-header-only - 头文件模式
这种方式使用纯头文件实现,所有代码在编译你的项目时即时编译。
CMakeLists.txt:
find_package(fmt CONFIG REQUIRED)
target_link_libraries(main PRIVATE fmt::fmt-header-only)
背后的工作:
- 只包含头文件,没有单独的库文件链接
- 所有模板和实现都在头文件中
优点:
- ✅ 部署简单:不需要单独安装库
- ✅ 版本控制简单:与你的代码一起编译
- ✅ 更好的优化机会:编译器可以看到完整实现
缺点:
- ❌ 编译速度慢:每次都要编译 fmt 代码
- ❌ 二进制大小较大:可能包含未使用的代码
- ❌ 可能增加编译内存使用
实际代码示例
使用 fmt::fmt(预编译库)
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)
find_package(fmt 8.0 CONFIG REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main PRIVATE fmt::fmt)
// main.cpp

最低0.47元/天 解锁文章
642

被折叠的 条评论
为什么被折叠?



