【C++ Boost 开源库 】从安装到运用

1. Boost 开源库的介绍

推荐看下面的博文,就不重复造轮子了
https://blog.csdn.net/qq_44681788/article/details/130895520

2. Boost 开源库下载

这里推荐这个链接,需要的版本只需要改后面的版本号即可

https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/
https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/

修改1.85 - > 1.84就可以下载对应的版本

最新版的下载地址

https://www.boost.org/users/download/

3.Boost 安装 [1.85.0]

下载后解压,win系统运行bootstrap.bat, linux 运行 bootstrap.sh

A moment later ~~

你会发现目录中多了个 b2.exe , 这是个编译器, 下面看看他的用法

4. Boost 编译 [1.85.0]

运行b2.exe 会编译全部的库,如果你不想全部编译,嫌他体积过大,可以选择性编译,这个时候就需要使用命令了

# 如果没有添加环境变量 使用 ./b2.exe  添加的话用  b2  我这里没添加 # 全编译./b2.exe --build-dir=build-directory --stagedir=stage-directory toolset=msvc-14.3 address-model=64 variant=debug link=static threading=multi runtime-link=static# 编译 thread 多线程库./b2.exe --build-dir=build-directory --stagedir=stage-directory toolset=msvc-14.3 address-model=64 variant=debug link=static threading=multi runtime-link=static --with-thread

下面说一下每个参数的具体含义

 (1) –build-dir=build-directory:指定临时构建文件(例如,编译中间产物)的存储目录。这有助于保持源目录的清洁,特别是在大规模构建时。一般可以不指定。(2)stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(D:\boost\boost_1_70_0,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。(3)toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等,VS2019对应msvc-版本我查不到,就是用了14。下面是vs对应的msvc的版本
MSVC++ 14.3 _MSC_VER == 1930 (Visual Studio 2022)MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)MSVC++ 9.0  _MSC_VER == 1500 (Visual Studio 2008)MSVC++ 8.0  _MSC_VER == 1400 (Visual Studio 2005)MSVC++ 7.1  _MSC_VER == 1310 (Visual Studio 2003)MSVC++ 7.0  _MSC_VER == 1300MSVC++ 6.0  _MSC_VER == 1200MSVC++ 5.0  _MSC_VER == 11004)without/with:选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。查看boost包含库的命令是bjam --show-libraries。(5)stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。我这里直接保存到了“D\boost“目录下了。(6)build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK\boost)下,目录名为bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。(7)link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。(8)runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。(9)threading:单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。(10)debug/release:编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。(11) --with-thread选择性编译的库,可以指定需要编译的库,在libs文件夹中

5. Boost 创建线程

Boost库提供了boost::thread类来创建和管理线程。以下是使用Boost库创建线程的示例:

#include <iostream>
#include <boost/thread.hpp>using namespace std;void threadFunc() {cout << "Hello, world!" << endl;
}int main() {boost::thread t(threadFunc); // 创建一个线程,并绑定函数 threadFunc()t.join(); // 等待线程结束return 0;
}

在上述示例代码中,我们通过boost::thread来创建一个线程,将其绑定到函数threadFunc()上,然后使用join()方法等待线程结束。

需要注意的是,当我们使用Boost库创建线程时,需要链接pthread库,可以在编译指令中添加-l选项来链接该库。例如,在Linux上可以使用以下编译指令:

g++ -o myprogram myprogram.cpp -lboost_thread -pthread

在Windows上,需要将编译器的运行时库由默认的Multi-threaded改为Multi-threaded DLL,否则会编译出现链接错误。

#define BOOST_THREAD_VERSION 4
#include <iostream>
#include <boost/thread/thread.hpp>using namespace std;void threadFunc() {cout << "Hello, world!" << endl;
}int main() {boost::thread t(threadFunc);t.join();return 0;
}

1.全局函数创建线程
boost库提供了boost::process::child类来创建新进程,具体方法如下:

#include <iostream>
#include <boost/process.hpp>using namespace std;
namespace bp = boost::process;void subProcess() {cout << "sub process" << endl;
}int main() {vector<string> args; // 子进程命令行参数args.push_back("myprogram");bp::child c(bp::exe = "./myprogram", bp::args = args); // 创建子进程c.wait(); // 等待子进程结束subProcess(); // 在主进程中继续执行一些操作return 0;
}

在上述示例代码中,我们使用bp::child类来创建一个新的子进程,将其执行文件设置为"./myprogram",并指定命令行参数为args,然后使用c.wait()等待子进程结束。待子进程结束后,控制会返回到主进程中,继续执行subProcess()函数中的操作。

需要注意的是,使用Boost库创建新进程时,需要链接Boost.Process库,可以在编译指令中添加-l选项来链接该库。例如,在Linux上可以使用以下编译指令:

 g++ -o myprogram myprogram.cpp -lboost_process
  1. 类内函数创建线程
#include <iostream>
#include <boost/thread.hpp>using namespace std;class MyClass {
public:void threadFunc() {cout << "Hello, world!" << endl;}void startThread() {boost::thread t(&MyClass::threadFunc, this); // 创建线程,并绑定对象及成员函数t.join();}
};int main() {MyClass obj;obj.startThread();return 0;
}

3 类外使用类内创建线程
使用Boost库进行类外使用类内函数创建线程的方法,需要创建一个Wrapper类,并使用boost::bind来绑定对象及成员函数。

以下是使用Boost库在类外使用类内函数创建线程示例代码:

#include <iostream>
#include <boost/thread.hpp>
#include <boost/bind.hpp>using namespace std;class MyClass {
public:void threadFunc() {cout << "Hello, world!" << endl;}
};class Wrapper {
public:Wrapper(MyClass* obj) : m_obj(obj) {}void startThread() {boost::thread t(boost::bind(&MyClass::threadFunc, m_obj)); // 使用boost::bind来绑定对象及成员函数,创建线程t.join();}
private:MyClass* m_obj;
};int main() {MyClass obj;Wrapper wrap(&obj);wrap.startThread();return 0;
}

谨以此文, 留作备忘,不喜勿喷,谢谢观看·~

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

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

相关文章

简述Java虚拟机(JVM)的工作原理

一、技术难点 Java虚拟机&#xff08;JVM&#xff09;的工作原理是Java技术体系中的核心部分&#xff0c;其技术难点主要体现在以下几个方面&#xff1a; 跨平台性&#xff1a;JVM是实现Java“一次编写&#xff0c;到处运行”跨平台特性的关键。JVM需要屏蔽与具体操作系统平台…

获得 AI Applied Skills 凭证:微软在线评估认证的注意事项

在你踏上微软的亚洲AI奥德赛之旅&#xff0c;完成基础课程学习后&#xff0c;你可以继续进行相应的评估&#xff0c;在交互式实验室体验中完成一系列任务&#xff0c;通过线上即时评估赢得认证。通过本文的介绍&#xff0c;可以帮助你了解评估认证的一些细节以及注意事项&#…

CSS与表格设计

在网页设计中&#xff0c;表格是一种不可或缺的元素&#xff0c;用于展示和组织数据。虽然HTML提供了基本的表格结构&#xff0c;但通过CSS&#xff08;层叠样式表&#xff09;的应用&#xff0c;我们可以极大地提升表格的外观和用户体验。本文将探讨如何利用CSS来设计既美观又…

一般EI论文的格式是什么样的?

论文应该符合会议的提交要求和模板&#xff0c;包括页面格式、字体、字号、行距等。可以在特定会议的官方网站上找到详细的提交指南和模板。 EI会议论文的格式通常遵循以下基本结构&#xff1a; 标题和作者信息&#xff1a;论文标题应该简洁明了&#xff0c;能够准确概括您研究…

ubuntu_概念

su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统&#xff0c;方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…

OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;高效开源的OCR工具&#xff1a;Surya-OCR介绍与使用 1 背景 在众多企业应用中&#xff0c;光学字符识别 (OCR) 是一项基础技术。在本文中&…

qt for android 重新编译Qt6Android.jar

QT相关 编译Qt6Android.jarqt 6.7 WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES样式问题APP商店退回用户未点击《用户协议》就启动传感器 编译Qt6Android.jar qt版本&#xff1a;6.7 进入到Qt源码目录 <你的qt目录>\Src\qtbase\src\android\…

MySQL主从复制(二):高可用

正常情况下&#xff0c; 只要主库执行更新生成的所有binlog&#xff0c; 都可以传到备库并被正确地执行&#xff0c; 备库就能达到跟主库一致的状态&#xff0c; 这就是最终一致性。 但是&#xff0c; MySQL要提供高可用能力&#xff0c; 只有最终一致性是不够的。 双M结构的…

Golang:发起http请求-GET带参数、POST发送Form和JSON数据

文档 https://pkg.go.dev/net/httphttps://pkg.go.dev/net/url 目录 1、发起GET请求2、发起带参GET请求3、POST请求提交Form表单4、POST请求提交Json数据5、接收响应数据&#xff0c;json转为map6、自定义请求头 1、发起GET请求 使用net/http 可以很容易发起get请求 package…

python实现nacos服务注册和HTTP探活

如果使用nacos-sdk-python&#xff08;注意适用nacos版本&#xff09;&#xff0c;需要按照下面的链接修改源码的bug https://github.com/nacos-group/nacos-sdk-python/issues/135 代码如下&#xff1a; import nacos import threading import socket import requests impo…

大语言模型调优SFT RLHF

模型调优 大语言模型调优是通过准备训练数据&#xff0c;并在已有的预训练模型上进行调优&#xff0c;包括 llama、千问等模型&#xff0c;从而可以让模型学习到私有知识或者增强模型的已有知识。因此&#xff0c;如果要想训练一个效果好的模型&#xff0c;我们就需要提供大量…

【人工智能】模型性能评估

模型性能衡量介绍 混淆矩阵 混淆矩阵(Confusion Matrix&#xff09; TP(真阳性)&#xff1a;预测为阳性&#xff0c;且预测正确。 TN(真阴性)&#xff1a;预测为阴性&#xff0c;且预测正确。 FP(伪阳性)&#xff1a;预测为阳性&#xff0c;但预测错误&#xff0c;又称型一误…

json文件写操作-下文

接上文json文件写操作 2.4 控制函数长度代码规范版 #include <iostream> #include <string> #include "../3rd/cJSON/cJSON.h" #include "../test_memset/include/ArrayToZero.h"using namespace std;void AddLikeObject(cJSON* interest, c…

【NumPy】关于numpy.reshape()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

实时检测GPU使用率nvidia-smi

nvidia-smi --query-gpuutilization.gpu --formatcsv,noheader,nounits 为了判断所有 GPU 的利用率都小于阈值&#xff0c;可以循环检查每一个 GPU 的利用率。如果所有 GPU 的利用率都低于阈值&#xff0c;则增加空闲时间计数&#xff1b;否则&#xff0c;重置空闲时间计数。 …

python文件名通常以什么结尾

python文件后缀一般有两个&#xff0c;分别是.py和.pyw。视窗用 python.exe 运行 .py&#xff0c;用 pythonw.exe 运行 .pyw 。 这纯粹是因为安装视窗版Python时&#xff0c;扩展名 .py 自动被登记为用 python.exe 运行的文件&#xff0c;而 .pyw 则被登记为用 pythonw.exe 运…

信息系统项目管理师--八大绩效域-度量绩效域

信息系统工程师的八大绩效域包括&#xff1a;干系人、团队、开发方法和生命周期、规划、项目工作、交付、度量、不确定性。 度量绩效域涉及评估项目绩效和采取应对措施相关的活动和职能。 预期目标 对项目状况充分理解数据充分、可支持决策及时采取行动&#xff0c;确保项目最…

[程序员] 最近的感悟,错误处理占大头?

根据昨天分享的一个问题&#xff0c;想到的。 在代码里&#xff0c;异常处理的代码也算是占大头&#xff0c;扑面而来的就是发生错误时怎么处理的大片代码&#xff1b;而且出现问题的概率是绝对的占大头。所以&#xff0c;异常代码出现bug的概率也在不知不觉中增加&#xff01…

linux中使用yum下载对应软件包的离线安装包

方案一&#xff08;推荐&#xff09;&#xff1a;repotrack #安装yum-utils yum -y install yum-utils #下载 ansible 全量依赖包 -p 指定下载目录 -a 指定版本 repotrack -a x86_64 -p /tmp ansible 方法二&#xff1a;yumdownloader yumdownloader 命令在软件包 yum-utils…

LeetCode刷题之HOT100之汉明距离

大家晚上好啊&#xff0c;今天几乎啥也没干&#xff0c;上个课就耽误了一下午&#xff0c;晚上来了积极性也不高&#xff0c;先完成今天的题目吧&#xff0c;请看题&#xff1a; 1、题目描述 2、逻辑分析 没有遇到过这种题目&#xff0c;想不出来有什么解法&#xff0c;看题解…