Boost安装和创建线程的使用

Boost

一 Boost库的基本介绍

Boost是一个流行的C++库集合,它包含了大量的用于C++程序开发的工具和组件,能够使C++程序员更快地开发高质量的代码。Boost库的目标是在不增加复杂性的情况下,提供对C++语言现有功能的增强,并且对标准C++库进行补充。

Boost库中的组件包括但不限于:智能指针、容器、多线程、正则表达式、数值算法、文件系统操作、日期和时间处理等。这些组件都被广泛应用于诸如高性能计算、网络编程、图像处理和数据分析等多个领域中。

Boost库本身遵循开源软件协议,可以在www.boost.org上找到最新版本。已经成为C++社区中最为流行和重要的库之一,被许多大型C++项目所使用。

二 Windows下安装Boost库

在Windows下,下载和安装Boost库可以通过以下步骤完成:

  1. 前往Boost库的官方网站https://www.boost.org/ ,在页面中找到"Download"按钮,点击进入下载页面。(我直接下载最新的版本为1.82.0);
    链接: boost download

  2. 在下载页面中,选择您要下载的Boost版本(建议选择最新版本),选择支持您的编译器版本并选择要下载的boost库包类型。例如,如果您使用的是Visual Studio 2019,则应该选择"Windows"平台, “MSVC版本”, “x64(64位)Windows”、“ZIP格式(7z格式)”。

  3. 下载完成后,解压缩压缩包。将解压缩文件夹放在合适的路径下以方便访问,例如"C:\boost_1_82_0"。(这个路径不唯一,看你个人喜好,安排在哪里)

  4. 编译库生成lib(静态库);

  • 第一步:打开cmd(命令行窗口),然后跳转到boost库目录下 。
  • 第二步:执行 bootstrap.bat 批处理(耐心等待批处理执行结束。)。执行结束后,会在当前目录下生成 b2.exe 文件。然后双击执行该可执行文件,并等待其执行结束。执行完生成的库(其中mt表示多线程,sgd中的s表示runtime 是static,gd表示debug版本)。在调用静态库时,根据自己的编译环境选择。
    • 静态库以 lib 开头,动态库开头没有 lib。
    • 所有的库都含有 boost 前缀。
    • Boost 库名称。
    • MSVC-14.2:对应Visual Studio 2019,编译器版本号为19.2。
    • 有 mt 代表 threading=multi,没有则代表 threading=single。
    • 有 s 代表 runtime-link=static,没有则代表 runtime-link=shared。
    • 有 gd 代表 debug 版本,没有则代表 release 版本。
    • 目标位数,x32 代表 32 位,x64 代表 64 位。
    • Boost 库的版本号,1_82 代表 Boost 1.82 版本。
  1. 打开Visual Studio或其他支持boost库的编译器,打开工程,选择要使用boost库的工程文件,在"项目属性"窗口中,选择"C/C++" -> “常规” -> “附加包含目录”,加入boost库的头文件目录,例如"C:\boost_1_82_0"(根据自己安装的路径来) 。

  2. 在同一属性窗口下,选择"链接器" -> “常规” -> “附加库目录”,加入boost库文件的目录,例如"C:\boost_1_82_0\stage\lib"(根据自己安装的路径来)。

  3. 在同一属性窗口下,选择"链接器" -> “输入” -> “附加依赖项”,加入你需要使用的boost库。

  4. 点击确定保存设置,重新构建项目即可使用boost库。

测试demo

#include <iostream>
#include <boost/version.hpp>
#include <boost/config.hpp>
 
using namespace std;
int main(){
    
    
	cout<<BOOST_VERSION<<endl;
	cout<<BOOST_LIB_VERSION<<endl;
	cout<<BOOST_PLATFORM<<endl;
	cout<<BOOST_COMPILER<<endl;
	cout<<BOOST_STDLIB<<endl;
	getchar();
	return 0;
}

结果显示 对应版本等信息;

三 Linux(Ubuntu20.04)下安装Boost库

方法一:

在Ubuntu 20.04下安装Boost库,可以按照以下步骤:

  1. 打开终端,输入以下命令安装Boost库:
sudo apt-get update
sudo apt-get install libboost-all-dev
  1. 等待安装完毕后,就可以使用Boost库了。

如果您只需要使用其中的部分库,而非全部库,您可以使用以下命令安装部分库:

  1. 输入以下命令来列出所有可安装的Boost库:
sudo apt-cache search libboost
  1. 选择需要安装的库,并使用以下命令安装:
sudo apt-get install libboost-"库名"-dev

例如,如果只需要安装Boost中的date_time库,可以使用以下命令:

sudo apt-get install libboost-date-time-dev  

安装完毕后,您就可以在程序中使用Boost库了,只需在Makefile或编译命令中添加"-lboost_库名"以链接对应的库。例如,如果需要使用Boost中的DateTime库,就需要在编译选项中添加"-lboost_date_time"。

方法二:

  • 1.前往Boost库的官方网站https://www.boost.org/ ,在页面中找到"Download"按钮,点击进入下载页面。(我直接下载最新的版本为1.82.0
    链接: boost download

  • 2.下载压缩包后拷贝到Linux虚拟机里,解压出如下文件,路径不限;

  • 3.运行脚本文件生成编译安装程序 “b2”

    sudo ./bootstrap.sh
    
  • 4.运行编译安装程序 “b2” 并指定安装路径(此过程可能会很慢)

    sudo ./b2 install --prefix=/usr/local/boost_1_82_0
    
  • 5.编译安装完成后,上一步指定的安装路径 ( /usr/local/boost_1_82_0 ) 下会生成 “include” 、“lib” 两个文件夹

    : 头文件(.h/.hpp)

    : 静态库文件(libxxx.a)和动态库文件(libxxx.so)

  • 6.最后,可以把这三个目录加到系统对应的环境变量里:

    对所有用户有效修改 “/etc/profile” 可能需要重启系统才会生效对个人有效则修改 “~/.bashrc”

    gcc 编译器找到头文件(xxx.h)的路径,写C++程序一般都不会用到gcc,所以这个可以忽略不写

    export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/boost_1_82_0/include  
    

    g++ 编译器找到头文件(xxx.h/hpp)的路径

    export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/boost_1_82_0/include
    

    找到静态库(xxx.a)的路径

    export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/boost_1_82_0/lib  
    

    找到动态链接库(xxx.so)的路径

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/boost_1_82_0/lib
    

测试demo

#include <iostream>
#include <boost/version.hpp>
#include <boost/config.hpp>
 
using namespace std;
int main(){
    
    
	cout<<BOOST_VERSION<<endl;
	cout<<BOOST_LIB_VERSION<<endl;
	cout<<BOOST_PLATFORM<<endl;
	cout<<BOOST_COMPILER<<endl;
	cout<<BOOST_STDLIB<<endl;
	getchar();
	return 0;
}

编译

g++ boost.cpp -o boost -lboost_system

结果

108200
1_82
linux
GNU C++ version 9.4.0
GNU libstdc++ version 20210601

四 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

2 类内函数创建线程

#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;
}

猜你喜欢

转载自blog.csdn.net/m0_58235748/article/details/131383122