c++ header-only library
1. 什么是 Header-only Library?
Header-only 库只提供 .h/.hpp 文件,没有 .cpp,也不生成
.a/.so。使用时只需:
#include "xxx.hpp"
常见例子包括:
-
Boost 部分库(Asio、Spirit 等)
-
fmt(header-only版本)
-
Catch2
-
nlohmann/json
2. 为什么只引入头文件就能用?
原理 1:模板必须放在头文件中
模板代码只有在实例化时才会生成实际函数/类,因此模板实现必须放在头文件中。
template<typename T>
class Vector {
public:
void push(T v) { data.push_back(v); }
private:
std::vector<T> data;
};
原理 2:inline 防止多重定义
头文件被多个源文件包含,如果函数没有被 inline 修饰会产生 ODR 冲突。
inline int add(int a, int b) { return a + b; }
原理 3:constexpr / static 函数也适合写在头里
这些关键字帮助避免符号冲突。
原理 4:C++17 inline 变量
允许定义头文件中的全局变量:
inline int global_value = 10;
3. 为什么不需要 .a 或 .so?
因为 header-only 库的代码是在 使用者编译阶段生成的,而不是预编译为目标文件。
传统库:
库.cpp → .o → .a / .so → 链接
Header-only:
用户.cpp + 库.hpp → 一起编译 → 可执行文件
4. 哪些库不能只靠头文件使用?
以下情况一般无法 header-only:
- 大量非模板函数 - 需要隐藏实现
- 使用汇编优化 - 依赖系统库 - 提供 C 接口
例如: - OpenSSL、OpenCV、gRPC 等都必须链接。
5. 如何判断库是否是 header-only?
| 判断方式 | 结论 |
|---|---|
有没有 .cpp ? |
有 → 要链接 |
| 文档是否写 header-only? | 写了 → 是 |
| 是否大量模板? | 可能是 |
| 是否只需 include 就能用? | 大概率是 |
总结
C++
只包含头文件就能使用,是因为库将所有实现写入模板、inline、constexpr,使编译器在用户代码编译阶段直接生成最终代码,不需要预编译静态或动态库。

浙公网安备 33010602011771号