WiS*_*GaN 15 c++ linker boost header
在Boost Library Documentation页面上,有两个名为" Header Only Libraries "和" Automatic Linking "的类别.
我认为"仅限头文件库"意味着您不必链接Boost.Timer库以便使用它们,而"自动链接"意味着您必须链接.
但是当我使用时timer,我必须链接一个名为的静态或动态库libboost_timer.a(libboost_timer.so.1.48.0以及Boost.Timer各种软链接到linux lib路径下的这些),这显然是确切的库文件Boost.System.我甚至需要来链接Boost.Chrono和Boost.Asio,虽然这是可以理解的是,库本身使用的是需要链接一些其他的库.
另一方面,asio已明确声明Boost.Timer属于"自动链接",但没有任何类似的库文件timer.
那么,作为" 仅限标题库 "还是" 自动链接 " 实际上意味着什么呢?还是纯粹是一个错误?
rod*_*igo 10
正如您所说,"仅头文件库"意味着整个库位于头文件中,因此一行(或多#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库文档页面库文档页面中,您可以看到Asio 由于依赖性而被列为自动链接.特定依赖项列在其他地方:Boost.System和Boost.Regex,两者都呈现自动链接.
你几乎已经把它钉了 - 一个只有头文件库,其中该库的所有代码都包含在头文件中,所以你只需要包含它们,而不是链接到库来使用它们.
也就是说,完全有可能编写一个仅依赖于其他库的头文件库,这些库可能不属于仅限标题的库.在这种情况下,即使您不必告诉链接器您正在使用的第一个库,您仍然需要告诉它第二个库.特别是当/如果所有代码都被填充到链接器认为是库(例如,一个.lib或.a文件)之一时,这可能最终导致区别而没有区别(只是为了清楚:那个在这里不一定是这种情况,但无论如何它都可以而且确实会出现).