Повысить документацию 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
Запуск обоих выдает одинаковый вывод с текущим временем.
Если нет задокументированной разницы, вы можете быть уверены, что ее нет.
Техническое различие, конечно, заключается в том, что двоичный файл будет больше (содержит все необходимые определения, которые в противном случае были бы в общей библиотеке).
Для других библиотек (например, Boost System) выбор варианта только для заголовка будут программы воздействия, например, ссылка на другие библиотеки, которые также использовали Boost System. Разница будет в дублировании глобалов, когда они будут использоваться совместно в сценарии динамического связывания. Ярким примером этого могут быть категории ошибок.
Если вы хотите быть бдительными, ищите (статические) глобальные данные, которые нужно было бы распространять, а не дублировать. Я не сразу знаю о таких данных в Boost Chrono.
Других решений пока нет …