boost库在visual studio、DevC++和vscode上的环境配置

2023-05-16

目录标题

    • @[TOC](目录标题)
    • 1.boost库简介
      • 1. 获取 Boost
      • 2. Boost 的目录结构
      • 3. Boost 使用方式
    • 2.在DEVC++中配置使用boost库的环境
    • 3.在visual studio中配置boost库使用环境
    • 4.在vscode中使用boost库

1.boost库简介

Boost 是一个功能强大、构造精巧、跨平台、开源并且完全免费的 C++ 程序库。

1998 年,Beman G.Dawes(C++标准委员会成员之一)发起倡议并建立了 Boost 社区,其目的是向 C++ 程序员提供免费的、经同行审查的、可移植的、高质量的 C++ 源程序库。

Boost 强调程序库要与 C++ 标准库很好地共同工作,建立在“既有的实践”之上并提供参考实现,因此 Boost 库可以适合最后的标准化。

自创立以来,Boost 社区的工作已经取得了卓越的成果,C++ 标准库中有三分之二来自 Boost 库,而且将来 Boost 库中还会有更多的库进入新标准。

C++ 四十余年的发展历史中产生了数不清的程序库,有影响力的程序库也不计其数,然而其中没有一个程序库能够与 Boost 相提并论,Boost 有着其他程序库无法比拟的优点,具体如下:

  1. 许多 Boost 库的作者本身就是 C++ 标准委员会成员,因此,Boost“天然”成了标准库的后备,负责向新标准输送组件,这也使得 Boost 获得了“准”标准库的美誉。

  2. Boost 独特的同行审查制度保证了每一个 Boost 库组件都经过了严格的审查和验证,使其具有很高的工业强度,甚至超过大多数商业产品的实现。

  3. Boost 采用了类似 STL 的编程范式,但却并没有 STL 那样晦涩难懂,其代码格式优美清晰、易于阅读,而且 Boost 附带丰富的说明文档——它既是一个程序库,也是一个很有价值的学习现代 C++ 编程的范本。

  4. Boost 的发布采用 Boost Software License,这是一个不同于 GPL 和 Apache 的非常宽松的许可证,该许可证允许库用户将 Boost 用于任何用途,既鼓励非商业用途,也鼓励商业用途。用户无须支付任何费用,不受任何限制,即可轻松享有 Boost 的全部功能。

Boost 官方于 2019 年 12 月发布的 1.72 版本,共包含 160 余个库/组件,涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域,使用 Boost,将大大增强 C++ 的功能和表现力。

1. 获取 Boost

Boost 提供源码形式的安装包,可以从 Boost 官方网站(https://www.boost.org/)下载最新版本。以 boost_1_72_0.tar.gz 为例,把该文件解压缩到磁盘任意位置即可,例如:

tar xvfz boost_1_72_0.tar.gz #解压缩到当前目录

2. Boost 的目录结构

Boost 压缩包解压后有5万多个文件,占据近 700MB 的磁盘空间,但其目录结构却很简洁清晰:

boost_1_72_0/  #存放配置脚本和说明文件
├──── boost    #最重要的目录,90%以上的Boost程序库源码都在这里
├──── doc      #HTML格式的文档,也可以生成PDF格式的文档
├──── libs     #所有组件的示例、测试、编译代码和说明文档
├──── more     #库作者的相关文档
├──── status   #可用于测试Boost库的各个组件
└──── tools    #b2、quickbook 等自带工具

在大多数情况下,我们只需要关心 boost 子目录,这里面以头文件的形式分门别类地存放了我们要使用的库代码:

boost_1_72_0/  #Boost 安装根目录
├──── boost    #boost子目录
│    ├──── accumulators #累加器库
│    ├──── algorithm    #算法库
│    ├──── align        #内存对齐库
│    ├──── archive      #序列化库
│    ├──── asio         #异步并发库
│    ├──── assign       #赋值初始化库
│    ├──── atomic       #原子操作库
│    ├──── beast        #高级网络通信库(HTTP/WebSocket)
│    ├──── bimap        #双向关联数组
│    ├──── bind         #bind表达式
│    ├──── chrono       #时间处理库
│    ├──── ...          #其他库……
│    └──── yap          #表达式模板库

3. Boost 使用方式

Boost 库的大多数组件不需要编译链接,我们在自己的源码里直接包含头文件即可。例如,如果要使用 boost::tribool,只需要在 C++ 源文件中添加如下 include 语句:

#include <boost/logic/tribool.hpp> //使用tribool库

细心的读者会发现,Boost 库的头文件与我们平常所用的头文件(*.h)或 C++ 标准库的头文件(没有后缀名)不同,这正是 Boost 的独特之处。它把 C++ 类的声明和实现放在了一个文件中,而不是分成两个文件,即.h+.cpp,故文件的后缀是.hpp

之所以这么做当然是有理由的。其中一个原因就是与普通的C头文件(*.h)区分,另一个很重要的原因就是使 Boost 库不需要预先编译,直接将其引入程序员的工程即可编译链接,方便了 Boost 库的使用。

Java、C#、PHP、Python 程序员应该对这种代码文件形式很熟悉,这几种语言都在一个文件中编写所有代码。

剩下的少量库(如 chrono、date_time、program_options、test、thread 等)必须编译成静态库或动态库,并在构建时指定链接选项才能使用。

不过有个好消息,其中有的库不需要编译也可以使用部分或全部功能,而更好的消息是有的库已经有了不需要编译的替代品。


2.在DEVC++中配置使用boost库的环境

在编译器选项中:
在这里插入图片描述

在目录-C++包含文件中,设置boost库的地址,注意是里面boost目录的上层地址。

这个设置的是包含文件,可以认为是头文件,此外我们可能还需要用到静态库,因此我们还需要设置一下静态库文件路径。

image-20210703101638632

通过上面两步,我们就设置好了在DEVC++下的使用环境。

下面我们来测试一下

#include <boost/lexical_cast.hpp>       
#include <iostream>

using namespace std;

int main()  
{  
    using boost::lexical_cast;  
    int a = lexical_cast<int>("123");  
    double b = lexical_cast<double>("123.0123456789");  
    string s0 = lexical_cast<string>(a);  
    string s1 = lexical_cast<string>(b);  
    cout << "number: " << a << "  " << b << endl;  
    cout << "string: " << s0 << "  " << s1 << endl;  
    int c = 0;  
    try{  
        c = lexical_cast<int>("abcd");  
    }  
    catch (boost::bad_lexical_cast& e){  
        cout << e.what() << endl;
    }

    return 0;
}

image-20210703102408130

可以看到能够正常使用了!


3.在visual studio中配置boost库使用环境

新建一个项目之后,设置一下包含目录

image-20210703103851790

再设置一下包含库目录

image-20210703104217173

继续用上面的代码进行测试

#include <boost/lexical_cast.hpp>       
#include <iostream>

using namespace std;

int main()
{
    using boost::lexical_cast;
    int a = lexical_cast<int>("123");
    double b = lexical_cast<double>("123.0123456789");
    string s0 = lexical_cast<string>(a);
    string s1 = lexical_cast<string>(b);
    cout << "number: " << a << "  " << b << endl;
    cout << "string: " << s0 << "  " << s1 << endl;
    int c = 0;
    try {
        c = lexical_cast<int>("abcd");
    }
    catch (boost::bad_lexical_cast& e) {
        cout << e.what() << endl;
    }
    return 0;
}

注意这边要设置成64位,因为编译的静态库和动态链接是64位。

image-20210703104325458

点击运行

在这里插入图片描述

既可以看到下面的输出结果,可以看出环境已经配置成功了

image-20210703104110930


4.在vscode中使用boost库

现在有很多小伙伴不用臃肿的IDE而改用vscode来写代码了。

vscode配置C/C++的环境可以看我这篇文章:vscode配置C/C++编译环境

本来应该是在这里面配置包含目录的,但是不知道为啥一直报错fatal error: boost/config.hpp: No such file or directory

"includePath": [
                "${workspaceFolder}/**",
                "E:/wenjian/cs/code/boost_1_76_0_2/boost_1_76_0/"
            ]

所以,没办法,我把boost目录拷贝到D:\MinGW\include,即gcc编译器的标准包含文件中,发现是可以正常运行的。

image-20210703152732456

image-20210703152809357

运行生成任务成功

在终端上键入 ./main.exe,输出

PS E:\wenjian\cs\code\boost_1_76_0_2\boost_1_76_0> ./main.exe
number: 123  123.012
string: 123  123.0123456789
bad lexical cast: source type value could not be interpreted as target

大功告成,总算能用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost库在visual studio、DevC++和vscode上的环境配置 的相关文章

  • boost::uuids::random_generator 和多线程的唯一性

    当我使用单线程生成随机数时 生成的 4M uuid 中没有重复项 但如果我使用两个线程生成每个 1M 我会看到大约 16 20 个重复项 可能是什么原因 class TestUuid public std string GenerateUU
  • 链接 boost 日志时出现链接器错误(对 boost::log::v2_mt_posix::sinks 的未定义引用)

    我正在尝试编译一个程序 该程序在 Ubuntu 上使用 boost 库 但出现错误 stepan stepan System Product Name dev g std c 11 Wall pedantic g O0 DBOOST LOG
  • 如何将 `std::chrono::milliseconds` 转换为 `boost::posix_time::milliseconds`

    我正在使用 boost asio deadline timer 像这样在async read操作在一个TCP套接字 我在用提升1 61 long time out millis 2000 boost asio deadline timer
  • 使用连续内存并具有保留功能的映射和集合

    我使用了几张地图和套件 缺乏连续内存以及大量的分配 解除 是性能瓶颈 我需要一个主要与 STL 兼容的映射和集合类 它可以将连续的内存块用于内部对象 或多个块 它还需要有一个reserve函数 以便我可以预先分配预期的大小 在我自己编写之前
  • VS2015:应用程序无法正确启动(0xc000007b)

    我在 Visual Studio 2015 上为 Windows 10 PC 编写了代码 该应用程序主要关注 UDP 通信 我使用 boost 库 它工作正常 但当我将代码文件夹移至 Windows 7 时 我收到错误 应用程序无法正确启动
  • 向量集合上的 C++ iterator_adapter [重复]

    这个问题在这里已经有答案了 可能的重复 展平迭代器 https stackoverflow com questions 3623082 flattening iterator 我有一个某种类型的向量 比如 int 我想迭代一下 在向量中的元
  • C++ boost enable_if问题

    我有什么办法可以简化以下陈述吗 可能 使用boost enable if 我有一个简单的类结构 Base基类 Derived1 Derived2继承自Base 我有以下代码 template
  • io_service::poll_one 非确定性行为

    在下面的代码中 我希望输出始终为 1 因为我希望在以下情况下仅运行一个处理程序 poll one 叫做 然而 一旦大约 300 次 输出实际上是 3 根据我对 boost 库的理解 这似乎不正确 不确定性行为是错误还是预期行为 includ
  • 使用 ctypes 从 python 访问 boost::进程间共享内存块

    我在 Windows 上运行的 C 程序中有一个结构 我想使用 ctypes 通过 Python 中的共享内存来访问该结构 例如 define MAX ENTITIES 30 struct State double x double y d
  • Qt 在信号/槽中使用 boost::shared_ptr

    是否可能 如果可以 如何在 Qt 中创建一个对共享指针常量引用的信号 槽 我想要一个如下所示的信号 void signal shared ptr
  • 为什么 boost::spirit::qi::parse() 没有设置这个 boost::variant 的值?

    当尝试将文本解析为 boost variant 时 变体的值不会更改 解析器本身似乎工作正常 所以我的假设是我对变体代码做了错误的事情 我使用的是 boost 1 46 1 以下代码在 Visual Studio 2008 中编译 第一次更
  • boost::filesystem::unique_path() 如何解决 C++ 中 mkstemp 类似物的需求?

    An old 功能要求 https svn boost org trac boost ticket 590对于 Boost 来说 请求的功能类似于mkstemp http pubs opengroup org onlinepubs 0096
  • 如何与android的静态boost库链接?

    我在使用 Android ndk r5b 将 boost 库移植和链接到 android 时遇到问题 我首先使用以下步骤构建 boost 库 没有 mpi python 1 注释掉boost 1 46 0 libs thread build
  • Boost 库构建 - 运行时链接和链接选项之间的区别

    我正在尝试使用 MSVC VS 2010 在 Windows 7 中构建 boost 库 我遇到过这些选择运行时链接和链接在 bjam 命令行选项中 我想知道它们是如何使用的以及它们之间的确切区别是什么 我已经使用此命令行构建了 Boost
  • Spirit qi 解析为嵌套函数的抽象语法树

    我正在尝试使用 boost 的spirit qi 解析器创建一个解析器 它正在解析包含三种类型值的字符串 常量 变量或函数 这些函数可以相互嵌套 测试字符串是f a b f g z x g x h x c where a e是常数 f r是
  • 当使用 async_write_some 和 async_write 时

    我正在阅读 Boost Asio 的文档 它说 boost asio async write some可能不会将所有数据传输到对等方 考虑使用async write如果您需要确保在异步操作完成之前写入所有数据 请使用该函数 所以这是我的问题
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • Boost.Intrusive 和 unordered_map

    我希望使用侵入性的 unordered map 由于某种原因 库中只有一个 unordered set 还有一个侵入式哈希表 但我不确定它是否具有相同的功能 而且它没有相同的接口 我错了吗 我错过了 unordered map 链接吗 如果
  • 使用 boost 几何检查两条线是否有交点

    是否可以使用 boost geometry 检查两条线段 每条线段由二维中的两个点给出 是否彼此相交 如果可能的话 boost geometry 是否还允许检查特殊情况 例如另一条线上只有一个点 数字上 或者两条线相等 如果你具体谈论Boo
  • 在类中使用静态互斥体

    我有一个可以有很多实例的类 它在内部创建并初始化来自第三方库 使用一些全局变量 的一些成员 并且不是线程安全的 我考虑过使用 static boost mutex 它将被锁定在我的类构造函数和析构函数中 因此 在我的线程中创建和销毁实例对于

随机推荐

  • ros自定义全局路径规划器并内置到ros工作空间

    ros自定义全局路径规划器并内置到ros工作空间 1 定义头文件2 类实现3 写好自己的cMakelist txt文件4 为我们的规划器写一个描述文件5 修改package xml文件6 运行catkin make进行编译 xff0c 如果
  • 从RRT到RRT*,再到Informed RRT*,路径规划算法怎么写

    从RRT到RRT xff0c 再到Informed RRT xff0c 路径规划算法怎么写 1 RRT算法1 1 假设1 2 RRT算法步骤与实现1 3 伪代码 2 RRT 算法3 Informed RRT 算法 做个正直的人 RRT中文名
  • VFH避障/局部路径规划算法

    VFH避障 局部路径规划算法 1 信度栅格 xff08 Certainty Grid xff09 2 势场法 xff08 Potential Field Methods xff09 3 VFH算法的前身 VFF xff08 Virtual
  • VFH+避障/局部路径规划算法

    VFH 43 避障 局部路径规划算法 1 第一部分 xff1a 映射到极坐标系VFH 43 对VFH的改进 考虑机器人的宽度 amp 对障碍物进行膨胀 2 第二部分 xff1a 二值化极坐标直方图VFH 43 算法对此提出了一种解决办法 二
  • 给树莓派刷入OpenWrt

    下载OpenWrt固件 进入OpenWrt官网 xff0c 进入固件列表 在选择框输入raspberry搜索树莓派的固件资源 xff0c 选择对应树莓派型号的下载链接 以3B 43 为例 xff0c 注意不支持一栏的提示 xff0c 可能产
  • VFH*避障/局部路径规划算法

    VFH 避障 局部路径规划算法 1 VFH 43 存在的问题 dead end2 VFH 算法2 1 VFH 算法概述2 1 1 VFH 的参数2 2 2 表示2 2 3 算法步骤 2 2 投影位置和方向2 3 代价函数2 3 1 k e
  • 新建ROS订阅者、发布者节点方法

    文章目录 1 新建一个该项目的工作空间 xff0c 并在其中创建一个文件夹src2 进入src文件夹 xff0c 并在其中创建一个package xff0c 运行如下命令即可3 返回上一层 xff0c 编译 xff0c 并source4 编
  • 基于光线跟踪的路径规划算法

    基于光线跟踪的路径规划算法 光线跟踪算法是我在 中国控制会议2022 上提出的一种全新的路径规划算法 这里附上论文链接 不自夸 xff0c 感兴趣的欢迎去阅读 xff0c 实现非常简单
  • ubuntu 20.04 配置cartographer 库

    ubuntu 20 04 配置cartographer 库 不要让别人占据你的大脑 一 安装Ceres 库1 安装依赖项2 下载源码3 编译源码4 安装 二 安装cartographer1 安装工具 xff1a wstool rosdep
  • 终于把前后端sm加解密以及加签验证调通了。

    终于把前后端sm加解密以及加签验证调通了 xff01 领导要求我对项目的数据传输安全考虑下 xff0c 因此就想到了对敏感字段做加密和对请求 响应做数字签名验证 网上看了很多文章 xff0c 可能是因为我对加密这块不了解 xff0c 感觉都
  • 【LeetCode】最接近原点的K个点 (优先队列PriorityQueue,快速排序的根据基准数分区思想(双指针法分区))

    LeetCode 最接近原点的K个点 xff08 优先队列PriorityQueue xff0c 快速排序根据基准数分区思想 双指针法分区 xff09 题目 xff1a 我们有一个由平面上的点组成的列表 points 需要从中找出 K 个距
  • 萌新解析正点原子悟空大四轴无人机ATKflight固件(持续更新中~)

    本博客用来记录学习ATKflight固件的学习过程 xff0c 本人萌新 xff0c 大佬们可以参考参考 本文默认已经了解FreeRTOS操作系统并且会简单的使用方法 xff0c 如果读者没了解过 xff0c 建议先看正点原子的FreeRT
  • FOC观测器之龙伯格观测器

    状态观测器 xff1a 根据控制理论 xff0c 如果一个系统能够完全通过其检测到的输出值来重构其系统状态 xff0c 则认为该系统是可观测的 其作用于无传感器转子的位置和速度的检测反馈 xff0c 再作用到PARK逆变换和转矩磁链控制上
  • VxWorks实时性能探究

    VxWorks实时性能探究 笔者最近在使用VxWorks操作系统 xff0c 由大名鼎鼎的风河 xff08 WindRiver xff09 开发 VxWorks操作系统是一款硬实时操作系统 xff0c 一直听闻其实时性能非常优秀 xff0c
  • VxWorks中的任务和进程线程的关系

    学过操作系统的 xff0c 对进程和线程应该是比较了解的 但是为了文章知识的完整性 xff0c 笔者先对操作系统中的进程和线程进行一些介绍 1 进程和线程的关系 为了不产生歧义 xff0c 先对一些易混淆的概念进行介绍 xff1a 代码 x
  • 优启通系统U盘制作及Win10系统安装

    前言 自己手动安装操作系统的方法总结 准备工作 一 xff1a Win10系统下载 MSDN 二 xff1a 利用PanDownload下载工具快速下载系统文件到本地 1 PanDownload下载安装 2 使用Pandownload新建离
  • FreeRTOS学习教程整理

    这篇博客主要用来整理一下FreeRTOS的主要学习资料 xff0c 方便以后学习查阅 首先当然是官网了 xff1a FreeRTOS 官网上有很多系统的资料 xff0c 还可以下载源码 不习惯英文的可以看这个中文教程 xff1a 中文教程环
  • Linux新手必须知道的配置知识(apt、pip、环境变量设置、更换安装源和pip镜像源)

    对于刚接触Linux的同学来说 xff0c 如果能过先对这些知识很熟悉的话 xff0c 那么对于在Linux上的环境配置你就会很熟悉了 一 apt 命令 apt 命令是一个功能强大的Linux命令行工具 xff0c 它不仅可以更新软件包列表
  • vscode配置C/C++编译环境

    这边记录一下配置vscodeC C 43 43 编译环境的过程 xff0c 以便以后要配置的时候可以直接参考 插件安装参考博文 xff1a VSCode配置C C 43 43 环境和Windows下VSCode配置C 43 43 环境 2
  • boost库在visual studio、DevC++和vscode上的环境配置

    目录标题 64 TOC 目录标题 1 boost库简介1 获取 Boost2 Boost 的目录结构3 Boost 使用方式 2 在DEVC 43 43 中配置使用boost库的环境3 在visual studio中配置boost库使用环境