18

Boost 库文档页面上,有两个类别,分别名为“ Header Only Libraries ”和“ Automatic Linking ”。

我想“仅标题库”意味着您不必链接Boost库即可使用它们,而“自动链接”意味着您必须链接。

但是当我使用. Boost.Timer_ 我什至需要链接and ,尽管库本身使用其他一些需要链接的库是可以理解的。timerlibboost_timer.alibboost_timer.so.1.48.0Boost.TimerBoost.SystemBoost.Chrono

另一方面,Boost 已经明确表示Boost.Asio属于"Automatic Linking",但没有任何名为asio.

那么,“仅标头库”或“自动链接”究竟意味着什么?或者这纯粹是一个错误?

4

2 回答 2

11

正如您所说,“仅标题库”意味着整个库都在头文件中,因此一行(或几#include行)足以使用它。不需要链接。

“自动链接”意味着,尽管库需要一些链接(直接或作为依赖项),但您不需要在编译器行中指定它,因为#include'd 文件会做一些魔术来引入适当的库自动,如果编译器支持。

例如,在MSVC编译器中,它们使用#pragman comment(lib, "..."); 在他们使用的 Borland 编译器中#pragma defineoptions;等。

最值得注意的是,GNU 编译器不支持“自动链接” 。

自动链接有时会很麻烦(例如,混合调试和发布版本),您可以通过定义一些预处理器宏来选择性地禁用它们:BOOST_<libname>_NO_LIB. 在这种情况下,您将不得不手动进行链接。

更新:关于您的评论如下:

Boost.Timer声称是“仅标题库”,但它在 lib 目录中有 lib 文件。

Boost 文档中似乎有错误。实际上有两个名为timer的不同库:旧的、已弃用的、仅包含标头的库<boost/timer.hpp>和新的、改进的、更酷的、可自动链接的库<boost/timer/timer.hpp>

但由于某种原因,主文档页面列出了旧页面的属性。

没有Boost.Asiolib文件。

在主 Boost library 文档页面library documentation page中,您可以看到 Asio 被列为Automatic linking due to dependency具体的依赖关系在别处列出:Boost.System 和 Boost.Regex,它们都存在自动链接。

于 2012-08-07T08:33:40.330 回答
9

你几乎已经搞定了——一个只有头文件的库是一个该库的所有代码都包含在头文件中的库,所以你只需要包含它们,而不是链接到一个库来使用它们。

也就是说,完全有可能编写一个依赖于其他库的仅标头库,这些库可能不是仅标头库。在这种情况下,即使您不必告诉链接器您正在使用的第一个库,您仍然必须告诉它第二个库。尤其是当/如果所有代码都可能被塞进链接器认为的库之一(例如,一个 .lib 或 .a 文件)中时,这可能最终主要是没​​有区别的区别(只是要清楚:这里不一定是这种情况,但无论如何它可以而且确实会出现)。

于 2012-08-02T01:09:43.290 回答