zoukankan      html  css  js  c++  java
  • boost为什么仅包含头文件就能用?

    1.Boost简介

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。

    既然是库那么使用的时候必然需要指定引用的头文件目录、库文件目录、和具体的库文件。对应到VS项目中:

    •  附加包含目录---添加工程的头文件目录
    •  附加库目录---添加文件引用的lib静态库路径
    •  附加依赖项---添加工程引用的lib文件名

    2.Boost库的使用配置

    c++ boost大多数组件都是仅包含头文件就能使用的,只有少部分需要单独编译。

    具体表现为:包含目录中添加了boost的目录,增加链接目录并没有指定具体的库文件。运行时竟然都不会报找不到对应的库文件错误。

    ?????大写的问号

    原来boost的组件有两种,一种是完全在.hpp中实现的,于是只要包含头文件即可。

    但是还有很多组件是需要链接库文件的,这时候boost就使用了一种叫做自动链接的技术。

     

    首先,在boost在编译过程中,会根据编译选项按照一定的规则命名库文件。

    然后,利用宏来组装预处理命令,就能链接到指定的库文件了。

    举个具体例子libboost_atomic-vc110-mt-s-x32-1_72.lib  

    vc110:VS2012 

    mt:多线程

    x32:32位编译器编译出来的动态库  1_72表示version

    然后在boost/atomic/detail/link.hpp中,可以看到这样两行:

    #define BOOST_LIB_NAME boost_atomic
    #include <boost/config/auto_link.hpp>

    在auto_link.hpp中,又可以看到:

    #ifdef BOOST_AUTO_LINK_TAGGED
    #pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT ".lib")

    这个预处理命令用来链接指定的库文件,这个展开来就是:

    #pragma comment(lib, libboost_atomic-vc110-mt-s-x32-1_72.lib)

    其他细节就不说了,总之只要在vs的设置中包含编译好的lib目录,就能自动链接到对应的库文件了。

    参考:https://blog.csdn.net/u012043391/article/details/54972127

    https://www.zhihu.com/question/275966715

  • 相关阅读:
    IIS 安装 pydio
    Windows环境配置Apache+Mysql+PHP
    Azure 云平台用 SQOOP 将 SQL server 2012 数据表导入 HIVE / HBASE
    PHP 启动 cURL模块以及启动失败的解决方案
    NodeJS 各websocket框架性能分析
    使用AndroidStudio编译NDK的方法及错误解决方案
    Ubuntu 系统下 mongodb 安装和配置
    Ubuntu安装nodeJS
    node.js应用Redis数据库
    Android平台相机接口的应用
  • 原文地址:https://www.cnblogs.com/zhaobinyouth/p/13769481.html
Copyright © 2011-2022 走看看