首页 > 解决方案 > Boost Chrono Header Only 与 Linked

问题描述

Boost Chrono 文档说可以将 chrono 库用作仅标头库。我没有看到任何提及将其用作仅标头库的限制。除了不需要链接 boost_chrono 的明显区别之外,当我定义 BOOST_CHRONO_HEADER_ONLY 宏时有什么变化?

我对将库用于 chrono_io 功能很感兴趣。我更喜欢使用仅标题版本,但想知道这样做会失去什么。如果没有任何区别,为什么链接版本存在?

#define BOOST_CHRONO_VERSION 2

#include <boost/chrono.hpp>
#include <boost/chrono/chrono_io.hpp>

int main(int argc, char **argv)
{
    const auto now = boost::chrono::system_clock::now();

    std::cout << "It is now " 
              << boost::chrono::time_fmt(boost::chrono::timezone::local) 
              << now << "\n";

}

编译

g++ -std=c++11 -o chronoLinked main.cpp -lboost_system -lboost_chrono
g++ -std=c++11 -o chrono main.cpp -lboost_system -D BOOST_CHRONO_HEADER_ONLY

运行两者会产生与当前时间相同的输出。

标签: c++boostboost-chrono

解决方案


如果没有记录的差异,您可以确信没有差异。

当然,技术上的区别在于二进制文件会更大(包含所有必需的定义,否则会在共享库中)。

对于其他库(如 Boost System),选择仅标头变体影响程序,例如链接到也使用 Boost System 的其他库的程序。不同之处在于全局变量在动态链接场景中共享时被复制。一个明显的例子就是错误类别。

如果您想保持警惕,请查找需要共享而不是复制的(静态)全局数据。我没有立即意识到 Boost Chrono 中的此类数据。


推荐阅读