返回顶部

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,使编译器在用户代码编译阶段直接生成最终代码,不需要预编译静态或动态库。

posted @ 2025-12-03 16:28  十方央丶  阅读(14)  评论(0)    收藏  举报