Uubntu下的Boost库安装及使用

一、Boost库介绍

Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。

Boost库由Boost社区组织开发、维护。其目的是为C++程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C++标准库共同工作,并且为其提供扩展功能。Boost库使用Boost License来授权使用,根据该协议,商业或非商业的使用都是允许并鼓励的。

Boost社区建立的初衷之一就是为C++的标准化工作提供可供参考的实现,Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。在Boost库的开发中,Boost社区也在这个方向上取得了丰硕的成果。在送审的C++标准库TR1中,有十个Boost库成为标准库的候选方案。在更新的TR2中,有更多的Boost库被加入到其中。从某种意义上来讲,Boost库成为具有实践意义的准标准库。

大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。里面有许多具有工业强度的库,如graph库。

很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。

介绍来之百度百科,Boost官网地址点这里

二、Ubuntu下Boost库源码下载及安装

找到指定的Boost版本,点这里
在这里插入图片描述
下载后后,解压

tar -zxf boost_1_75_0.tar.gz
# 进入 boost_1_75_0
cd boost_1_75_0

开始执行bootstrap.sh脚本安装boost库

sudo ./bootstrap.sh --with-libraries=all --with-toolset=gcc --prefix=/usr/local

预设参数说明

--with-libraries=all  指定编译哪些boost模块,all是指所有模块,如果只需要编译部分,则输入对应的库模块,多个模块用`,`符号分隔
--with-toolset=gcc 使用gcc编译器
--prefix=/usr/local 设置默认根目录,boost的include目录安装/usr/local/include/boost,lib的目录安装在/usr/local/lib

执行完成后如下所示
在这里插入图片描述
此时多出一个./b2文件,开始编译

# 启用8线程 编译使用 ./b2 --help,可查看更多的选项
sudo ./b2 toolset=gcc -j8
# 设置安装目录前缀/usr/local/boost,当然前面bootstrap脚本设置了前缀,这里也可以不用再设置了,直接使用./b2 install可以
sudo ./b2 --prefix=/usr/local/boost install

注意需要使用sudo超级管理员权限安装,否则可能会安装失败

完成安装

添加一下环境变量

vim ~/.bashrcCPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/boost/include
LIBRARY_PATH=$LIBRARY_PATH:/usr/local/boost/lib
export LIBRARY_PATH CPLUS_INCLUDE_PATH

重新加载一下环境变量

source ~/.bashrc
sudo ldconfig /usr/local/boost/lib/

如以上使用配置后,项目中引用#include <boost/xxx/xx.hpp>仍然报错不生效,则可在相应的IDE编辑器中,配置include目录,包含/usr/local/boost/include,不同的IDE,配置大同小异;

三、Boost库的简单使用测试

开发环境:Ubuntu22.04
IDE: VsCcode

测试1 - 引用无需预编译的模块(仅需要*.hpp)

新建一个项目proj_cpp_test,创建一个main.cpp,输入如下代码

// main.cpp
#include <boost/bind.hpp>
#include <iostream>
#include <string>
using namespace std;class HelloWorld
{
public:void say(string name) { cout << name <<": "<< "Hello world!" << endl; }
};int main()
{HelloWorld myHelloWorld;auto bind_func = boost::bind(&HelloWorld::say, &myHelloWorld, "Ming");bind_func();return 0;
}

如IDE环境配置正确,可能在Include时,就提示报错,如下所示
在这里插入图片描述
此时需要添在c_cpp_properties.json文件中,添加/usr/local/boost/include目录
在这里插入图片描述
其次,需要在tasks.json文件中,添加编译是的include目录/usr/local/boost/include(否则编译会报错),如下所示
在这里插入图片描述
完成后,输入Ctrl+F5运行编译,输出一个main目标文件,并执行该文件

./main
Ming: Hello world!

成功!

上面在c_cpp_properties.json添加的意义最直观的,就是做编码提示符用,实际上g++编译的include目录的配置是在tasks.json配置文件设置的,如果不在tasks.json配置,则编译时仍然会报错,无法正常编译。相反即使c_cpp_properties.json未正常配置,也不影响编译,只是IDE中看着难受的错误提示!

测试2 - 引用Boost中预先编译好的模块 (包含*.hpp及*.so)

新建一个项目proj_cpp_test2c_cpp_properties.jsontasks.json的配置与上面相同,创建一个main.cpp输入如下代码

// main2.cpp
#include <boost/thread/thread.hpp>
#include <iostream>
#include <cstdlib>
using namespace std;volatile bool isRuning = true;void func1()
{static int cnt1 = 0;while(isRuning){cout << "func1:" << cnt1++ << endl;sleep(1);}
}void func2()
{static int cnt2 = 0;while(isRuning){cout << "\tfunc2:" << cnt2++ << endl;sleep(2);}
}int main()
{boost::thread thread1(&func1);boost::thread thread2(&func2);thread2.join();thread1.join();cout << "exit" << endl;return 0;
}

运行编译,发现报错了;这是因为boost/thread/thread是预先编译的动态库,g++在编译时,找不到链接库;因此,我们需要在编译时,为g++指定库目录,及需要链接的库;显然需要为tasks.json 添加配置,如下所示:
在这里插入图片描述

-L 参数指定boost库的目录
-l 参数指定链接的库名

添加后,再次运行编译,成功!如下所示:
在这里插入图片描述

注意引用动态库的,在运行时,需要确保系统环境已正确加载动态库地址,使用ldconfig -p | grep boost命令查看一下boost的动态库是否能正确被加载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIoT的协同计算

目录 AIoT的协同计算 一、背景与意义 二、原理与方法 三、关键技术与挑战 四、应用与实践 AIoT的协同计算 一、背景与意义 随着物联网和人工智能技术的快速发展,智能物联网(AIoT)成为了一个新兴的前沿领域。在这个领域中,多移动终端设备如智能手机、可穿戴设备、无人…

Rust里面针对Option和Result的and_then和map有什么区别

在 Rust 中&#xff0c;Option 和 Result 类型都提供了 map 和 and_then 方法&#xff0c;用于处理可能存在的值或错误。虽然它们都可以用于转换值&#xff0c;但它们的行为和用途有所不同。下面我将详细比较 map 和 and_then 的使用和区别。 map 方法 定义 map 方法用于对 …

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计&#xff08;MLE&#xff09; 二、最大后验估计&#xff08;MAP&#xff09; 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时&#xff0c;MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频&#xff1a; 贝叶斯解释“L1和L2正则化”&#xff…

windows C#-异常处理

C# 程序员使用 try 块来对可能受异常影响的代码进行分区。 关联的 catch 块用于处理生成的任何异常。 finally 块包含无论 try 块中是否引发异常都会运行的代码&#xff0c;如发布 try 块中分配的资源。 try 块需要一个或多个关联的 catch 块或一个 finally 块&#xff0c;或两…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

Python自动化运维DevSecOps与安全自动化

Python自动化运维DevSecOps与安全自动化 目录 &#x1f6e1;️ DevSecOps概念与实践&#x1f50d; 自动化安全扫描与漏洞修复&#x1f9f0; 基于Python的安全审计与合规性检查&#x1f433; 云平台与容器安全&#xff1a;基于Python的容器扫描工具⚠️ 自定义安全检测与漏洞修…

数据结构与算法——Java实现 54.力扣1008题——前序遍历构造二叉搜索树

不要谩骂以前的自己 他当时一个人站在雾里也很迷茫 ​​​​​​​ ​​​​​​​ ​​​​​​​—— 24.11.6 1008. 前序遍历构造二叉搜索树 给定一个整数数组&#xff0c;它表示BST(即 二叉搜索树 )的 先序遍历 &#xff0c;构造树并返回其根。 保证 对于给定…

【Leecode】Leecode刷题之路第46天之全排列

题目出处 46-全排列-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 46-全排列-官方解法 预备知识 回溯法&#xff1a;一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解…

Android 10.0 app发送广播sendBroadcast的流程分析一

1.概述 在10.0的app开发过程中,在发送广播的功能也是非常常用的功能,而在系统中广播是AMS负责处理的, ActivityManagerService负责广播分发过来。ActivityManagerService是如何得到广播并把它分发出去的呢? 这就是本文要介绍的广播发送过程了 2.app发送广播sendBroadcast…

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…

CatLIP,加速2.7倍!采用分类损失的CLIP水准的预训练视觉编码器

CatLIP&#xff0c;加速2.7倍&#xff01;采用分类损失的CLIP水准的预训练视觉编码器 FesianXu 20241018 at Wechat Search Team 前言 传统的CLIP采用对比学习的方式进行预训练&#xff0c;通常需要汇聚多张节点的多张设备的特征向量以进行打分矩阵的计算&#xff0c;训练速度…

linux笔记(selinux)

一、概述 定义SELinux&#xff08;Security - Enhanced Linux&#xff09;是一种基于 Linux 内核的强制访问控制&#xff08;MAC&#xff09;安全机制。它为 Linux 系统提供了更细粒度的安全策略&#xff0c;增强了系统的安全性。目的主要目的是限制进程对系统资源&#xff08;…

GAT详解带例子

系列博客目录 文章目录 系列博客目录GAT 的核心概念GAT 工作原理举例&#xff1a;用 GAT 进行品牌与产品类型的共识推理1. 构建图结构2. 初始化节点特征3. 定义 GAT 模型4. 训练 GAT 模型5. 推理品牌-产品类型关系 示例代码解释 总结 图注意力网络&#xff08;Graph Attention …

int socket(int domain,int type,int protocol);

本文内容产生自智谱清言 头文件&#xff1a; #include <sys/socket.h> int socket(int domain,int type,int protocol); 它是在C语言中使用的一个系统调用函数&#xff0c;用于创建一个新的套接字。套接字是支持TCP/IP协议的网络通信的端点&#xff0c;可以看作是不同…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行&#xff0c;另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口&#xff0c;对某些接口加密的参数进行逆向破解&#xff0c;从而修改请求…

Scala 中 set 的实战应用 :图书管理系统

1. 创建书籍集合 首先&#xff0c;我们创建一个可变的书籍集合&#xff0c;用于存储图书馆中的书籍信息。在Scala中&#xff0c;mutable.Set可以用来创建一个可变的集合。 val books mutable.Set("朝花惜拾", "活着") 2. 添加书籍 我们可以使用操作符…

简单介绍一下mvvm mvc mvp以及区别、历史

MVC&#xff08;Model - View - Controller&#xff09; 因MVC架构的灵活性&#xff0c;架构图形式很多&#xff0c;仅供参考 历史&#xff1a; MVC 是最早出现的软件架构模式之一&#xff0c;其历史可以追溯到 20 世纪 70 年代&#xff0c;最初被用于 Smalltalk - 80 环境。…

线上问题排查的思路

线上问题排查的思路 线上问题的排查是一个很大的范围&#xff0c;其中包括服务器对应的硬件资源、软件资源、数据库使用情况等情况&#xff0c;下面将一一列举。一般情况下&#xff0c;系统出现事故&#xff0c;都会有事故报告&#xff0c;总结经验&#xff0c;避免下次出现类似…

“高级Java编程复习指南:深入理解并发编程、JVM优化与分布式系统架构“

我的个人主页 接下来我将方享四道由易到难的编程题&#xff0c;进入我们的JavaSE复习之旅。 1&#xff1a;大小写转换------题目链接 解题思路&#xff1a; 在ASCII码表中&#xff0c;⼤写字⺟A-Z的Ascii码值为65- 90&#xff0c;⼩写字⺟a-z的Ascii码值为97-122。每个字 ⺟…

结构体是否包含特定类型的成员变量

结构体是否包含特定类型的成员变量 在C中&#xff0c;可以使用模板元编程和类型特性&#xff08;type traits&#xff09;来判断一个结构体是否包含特定类型的成员变量。这通常通过std::is_member_object_pointer类型特性来实现&#xff0c;它可以用来检查给定的成员指针是否指…