C++:Boost库
今日安装一个PSI库时,需要boost库,在此认识一下boost库,转载:macOS 中Boost的安装和使用
介绍
Boost是一个功能强大,构造精良,跨越平台,代码开源,完全免费的C++程序库。
共包含160余个库/组件,涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域。
由c++标准委员会成员发起倡议并建立boost社区,C++11标准库中三分之二来自boost,并且将来还会有更多的库进入c++标准库,因此boost是一个c++ "准"标准库。
支持现有的所有操作系统。
Boost库的大多数组件不需要编译链接,源码里直接包含头文件。(注意:包含头文件的时候需要有boost目录,即#include "boost/logic/tribool.hpp",而不能是#include "logic/tribool.hpp")剩下的少量库(如chrono,date_time,program_options,test,threa等)必须编译成静态库或动态库,并在构建时指定链接选项才能使用。
Boost的独特之处:它把C++类的声明和实现放在了一个文件中,而不是分成两个文件,即.h+.cpp,故文件的后缀是.hpp。
功能
含有的功能类有:
- 字符串和文本处理库
- 容器库
- 迭代器库
- 算法库
- 函数对象和高阶编程库
- 泛型编程库
- 模板元编程
- 预处理元编程库
- 并发编程库
- 数学和数字库
- 排错和测试库
- 数据结构库
- 图像处理库
- 输入输出库
- 跨语言混合编程库
- 内存管理库
- 解析库
- 编程接口库
- 综合类库
- 编译器问题的变通方案库
目录结构
--boost:最重要的目录,90%以上的Boost程序库源码都在这里
--doc:HTMI格式的文档,也可以生成PDF格式的文档
--libs:所有组件的示例、测试、编译代码和说明文档
--more:库作者的相关文档
--status:可用于测试Boost库的各个组件
--tools:用于编译Boost的工具的源代码等
安装Boost
使用源码安装
(1)下载Boost源码
(2)解压放在任意目录,例如/usr/local/boost_1_63_0
./bootstrap.sh
./b2 headers
./b2
./b2 install
安装时间稍长,生成的静态(同态)文件都在/usr/local/lib中,需要cp到/usr/lib中,可以在代码中直接使用;头文件在/usr/local/include中。
使用Homebrew安装
(1)下载安装HomeBrew
brew install boost
(2)留意运行日志会显示头文件目录 /usr/local/Cellar/boost/1.60.0_2/include, lib目录/usr/local/Cellar/boost/1.60.0_2/lib
使用MacPort安装
下载安装MacPort
sudo port install boost
在CLion中使用Boost
(1)新建一个C++项目
(2)在cmakelists中 增加头文件目录
include_directories(/Users/pam/Desktop/pam/boost_1_78_0/)
或者
find_package(Boost 1.70.0 REQUIRED)
if(Boost_FOUND)
set(Boost_LIBRARY_DIRS D:/ScanSource/download/Boost/vc141_64/lib)
message(Boost_INCLUDE_DIRS " ${Boost_INCLUDE_DIRS}")
message(Boost_LIBRARY_DIRS " ${Boost_LIBRARY_DIRS}")
endif()
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
(3)替换main.cpp中代码,运行!输入任意数字回车可看到结果。

在XCode项目中使用Boost
(1)新建一个Command Line Tool项目
(2)在Build Setings - Header Search Paths 增加头文件目录
(3)替换main.cpp中代码,运行!输入任意数字回车可看到结果。
#include <iostream>
#include <boost/lambda/lambda.hpp>
int main(int argc, const char * argv[]) {
printf("Please input any number:");
using namespace boost::lambda;
typedef std::istream_iterator<int> in;
std::for_each(in(std::cin), in(), std::cout << (_1 * 3) << " " );
return 0;
}
在XCode项目中使用Boost Lib库
Boost的很多功能都是直接在hpp头文件里实现的,比如上面的lambda例子不用导入任何lib就可以运行了。但也有一部分需要依赖指定lib库才能使用。比如下面这个正则表达式的例子:
#include <iostream>
#include <boost/regex.hpp>
int main(int argc, const char * argv[]) {
std::string str = "2013-08-15";
boost::regex rex("(?<year>[0-9]{4}).*(?<month>[0-9]{2}).*(?<day>[0-9]{2})");
boost::smatch res;
std::string::const_iterator begin = str.begin();
std::string::const_iterator end = str.end();
if (boost::regex_search(begin, end, res, rex))
{
std::cout << "Day: " << res ["day"] << std::endl
<< "Month: " << res ["month"] << std::endl
<< "Year: " << res ["year"] << std::endl;
}
}
使用静态库
在Build Setings - Other linker flags
/usr/local/boost_1_63_0/stage/lib/libboost_regex.a
使用命令行编译相当于
c++ -I /usr/local/boost_1_63_0 main.cpp -o main /usr/local/boost_1_63_0/stage/lib/libboost_regex.a
./main
如果这里直接使用lboost_regex, Xcode默认加载动态库。实际运用中可以考虑将目录中的动态库删除,只保留静态库,并在Build Setings - Library Search Paths 增加lib文件目录。
使用动态库
(1)在Build Setings - Library Search Paths 增加lib文件目录
(2)将lib文件目录中的libboost_regex.dylib文件拖入项目
(3)确保在Build Phases - Link Bindary With Libraries中已经有该库
(4)在Build Phases - Copy Files, 复制libboost_regex.dylib到Products Directory
使用命令行编译相当于
c++ -I /usr/local/boost_1_63_0 main.cpp -o main -L/usr/local/boost_1_63_0/stage/lib/ -lboost_regex
cp /usr/local/boost_1_63_0/stage/lib/libboost_regex.dylib ./
./main
例子:
#include <iostream>
#include <boost/tuple/tuple.hpp>
#include "boost/version.hpp"
using namespace std;
void version()
{
cout << BOOST_LIB_VERSION << endl;
cout << BOOST_VERSION << endl;
}
int main()
{
using namespace std;
int i;
char c;
double d;
boost::tuples::tie(i,c,d);
boost::tuples::tie(i,c,d) = boost::tuples::tuple <int,char,double>(1,'A',0.68);
cout << d <<endl;
cout<<"BOOST的版本:";
version();
return 0;
}
参考
1、Boost(1):Boost库简介及安装
2、Boost库简介
3、https://zhuanlan.zhihu.com/p/85806857
4、https://blog.csdn.net/weixin_39766005/article/details/120305393
C++:Boost库的更多相关文章
- 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法
1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...
- vs2013给项目统一配置boost库
1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...
- [C/C++] C/C++延伸学习系列之STL及Boost库概述
想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...
- dev c++ Boost库的安装
dev c++ 的boost库的安装步骤 然后点击“check for updates”按钮 最后点击“Download selected”按钮,下载完成后安装.... 给dev添加boost库文件, ...
- vs配置boost库
步骤: 1.在boost官网下载boost版本,以1.59.0为例. 2.解压,解压后可看到文件夹下有个bootstrap.bat文件. 注意: 如果有以下error: 'cl' 不是内部或外部命令, ...
- windows下安装boost库
工作中现在会接触boost,所以我计划两个月之内努力熟悉一下boost.今天在自己win10系统上尝试安装了boost库,下面把遇到的问题总结一下: 1. 下好1.61版本库,在boost目录下运行b ...
- ubuntu 下安装boost库
ubuntu下安装boost库,,在网上试了一些其他人推荐的libboost-dev 但是会缺少,编译程序会报错: /usr/bin/ld: cannot find -lboost_serializa ...
- linux下编译安装boost库
linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4. ...
- C++ | boost库 类的序列化
是的,这是今年的情人节,一篇还在研究怎么用的文章,文结的时候应该就用成功了. 恩,要有信心 神奇的分割线 不知何时装过boost库的header-only库, 所以ratslam中的boost是可以编 ...
- boost库(条件变量)
1相关理念 (1)类名 条件变量和互斥变量都是boost库中被封装的类. (2)条件变量 条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线 ...
随机推荐
- vue前端分页多条件搜索
vue前端分页多条件搜索 fliterData() { if (this.query_syscode || this.query_version || this.query_group || Stri ...
- element ui Tree树形控件获取未全选父节点和子节点id
Tree树形控件选中状态 在做分配权限的时候如图选择了父节点的某些子节点,现在父节点是半选中状态,使用this.$refs.tree.getCheckedKeys()只能拿到当前的子节点,子节点全选才 ...
- ScheduledThreadPoolExecutor与System#nanoTime
一直流传着Timer使用的是绝对时间,ScheduledThreadPoolExecutor使用的是相对时间,那么ScheduledThreadPoolExecutor是如何实现相对时间的? 先看看S ...
- Windows系统下PhpStorm+Xdebug安装与调试
环境说明: 系统:Windows10 PhpStorm:2019.3.2 PHP版本:7.3.21 Xdebug版本 :2.7.2 一.Xdebug介绍 官网地址:https://xdebug.org ...
- GUETSEC
1. GUETSEC栈溢出 可以看到它看起来好像有四个栈溢出,我们逐个点进去 __isoc99_scanf("%20s", v1):限制了读取20个字符串(但其实无法完全杜绝缓冲区 ...
- Springboot优雅读配置文件
转载自Springboot优雅读配置文件 很多时候我们需要将一些常用的配置信息比如阿里云oss配置.发送短信的相关信息配置等等放到配置文件中. 下面我们来看一下 Spring 为我们提供了哪些方式帮助 ...
- js 实现可缓存方法
1.概述 有些场景下,如果一些函数需要大量的运算,但是他们的传入的参数是一样的,这个时候,我们可以将这些运算缓存下来,之后的运算就可以不用重复计算了. 2.实现方法 <script> // ...
- javascript的一些API接口的使用
1.blob http URL 在编辑器中,有的情况下插入图片,会讲图片转成 blob:http://localhost/*** 的这种形式.这种形式的URL实际数据是存放在浏览器的内存中. 这种情况 ...
- Vue.js 组件基础
1.前言 本节讲述vue组件的基本格式以及实际开发的应用场景,本节内容兼容Vue2.x与Vue3.x 2.组件基础 组件的本质其实就是一个对象,这个对象包含多个属性,常见的属性有:template/d ...
- 『玩转Streamlit』--片段Fragments
在 Streamlit 应用开发中,Fragments组件是一种用于更精细地控制页面元素更新和显示顺序的工具. 它允许开发者将内容分解成多个小的片段,这些片段可以按照特定的顺序或者逻辑进行更新,而不是 ...