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

1 篇文章 0 订阅

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 == 1300

MSVC++ 6.0  _MSC_VER == 1200

MSVC++ 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;
}

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

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值