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 会编译全部的库,如果你不想全部编译,嫌他体积过大,可以选择性编译,这个时候就需要使用命令了
bash
# 如果没有添加环境变量 使用 ./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
下面说一下每个参数的具体含义
csharp
(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 == 1300
MSVC++ 6.0 _MSC_VER == 1200
MSVC++ 5.0 _MSC_VER == 1100
(4)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库创建线程的示例:
cpp
#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上可以使用以下编译指令:
bash
g++ -o myprogram myprogram.cpp -lboost_thread -pthread
在Windows上,需要将编译器的运行时库由默认的Multi-threaded改为Multi-threaded DLL,否则会编译出现链接错误。
cpp
#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类来创建新进程,具体方法如下:
cpp
#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上可以使用以下编译指令:
bash
g++ -o myprogram myprogram.cpp -lboost_process
- 类内函数创建线程
cpp
#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库在类外使用类内函数创建线程示例代码:
cpp
#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;
}
谨以此文, 留作备忘,不喜勿喷,谢谢观看·~