一、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_test2
,c_cpp_properties.json
及tasks.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的动态库是否能正确被加载