目录python
boost 具备很好的平台独立性, 所以会做为首选的 api 来完成特定的功能.ios
我在项目中使用了 boost 的 filesystem 功能来获取程序的运行目录.c++
#include <boost/filesystem/path.hpp> #include <boost/filesystem/operations.hpp> int main() { ... std::string exePath = boost::filesystem::initial_path<boost::filesystem::path>().string(); ... return 0; }
但编译的时候提示以下错误:程序员
In function `__static_initialization_and_destruction_0(int, int)': process_template.cpp:(.text+0x1d09c): undefined reference to `boost::system::generic_category()' process_template.cpp:(.text+0x1d0a8): undefined reference to `boost::system::generic_category()' process_template.cpp:(.text+0x1d0b4): undefined reference to `boost::system::system_category()' CMakeFiles/process.dir/src/process_template.cpp.o: In function `boost::filesystem::initial_path()': process_template.cpp:(.text._ZN5boost10filesystem12initial_pathEv[_ZN5boost10filesystem12initial_pathEv]+0x19): undefined reference to `boost::filesystem::detail::initial_path(boost::system::error_code*)' collect2: error: ld returned 1 exit status
很明显是没有将对应的库连接进来. 所以, 须要在 CmakeLists.txt 中添加关于 boost 的连接选项.算法
cmake_minimum_required(VERSION 2.8) project( process ) SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11") find_package(Boost REQUIRED COMPONENTS # regex filesystem # 个人工程中只使用了 boost 的 filesystem 功能,所以这里只有一个组件 ) if(NOT Boost_FOUND) message("Not found Boost") endif() include_directories(${Boost_INCLUDE_DIRS}) message("${Boost_INCLUDE_DIRS}") message("${Boost_LIBRARIES}") add_executable( process src/process_template.cpp ) target_link_libraries(process ${Boost_LIBRARIES})
而后从新 make, 就能够顺利经过了.编程
[ 50%] Linking CXX executable process [100%] Built target process
另外, boost 支持的组件有: atomic, chrono, context, date_time, filesystem, graph_parallel, graph, iostreams, locale, log_setup, log, math_c99f, math_c99l, math_c99, math_tr1f, math_tr1l, math_tr1, mpi_python-py27, mpi_python-py34, mpi_python, mpi, prg_exec_monitor, program_options, python-py27, python-py34, python, random, regex, serialization, signals, system, thread, timer, unit_test_framework, wave, wserialization.api
Boost经常使用库概览数组
C++ 一直以来缺少对时间和日期的处理能力,而时间和日期又是现实生活中常常遇到的,因此C++程序员不得不求助于C,使用笨拙的结构和函数。没法忍受这一情形的程序员则手工构造了本身的首先以知足开发所需,这就致使了不少程序员在“重复的造轮子”Boost提供了 timer、date_time、chrono 三个库解决了上述问题,避免程序员重复造轮子。
(1)timer 库提供简易的度量时间和进度显示功能,能够用于性能测试等须要计时的任务,对于大多数的状况他足够用。
(2)date_time 库提供全面且灵活的日期时间库,目的就是简化复杂的日期和时间处理工做。
(3)chrono 库提供“计算机世界”的时间处理服务,实现计算机系统的精确计时。安全
C++ 标准没有像 Java、C# 等语言的垃圾回收机制,这就须要C++程序员本身去避免内存泄漏、悬挂指针、越界访问等内存问题。Boost 提供了诸多库来保证 C++ 高效、正确的内存管理工做,这些库包括:smart_ptr、scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr、intrusive_ptr、pool、object_pool、singleton_ptr、pool_alloc.bash
(1) system 库.
这不是一个总体库,只是把Boost中的一些比较小的、简单的库归为一个“工具库”,这些小工具库不全是类,也有宏,列举为:
(1)noncopyable 组件:实现一个禁止拷贝的类;
(2)ignore_unused 组件:保证程序中暂时不用但又必须保留的变量经过编译(不发出警告,注意,千万不要忽略程序编译过程当中编译器抛出的警告,要作到零警告零错误);
(3)optional 组件:包装“可能产生无效值”的对象,保证这些对象返回一个有效值或者default值;
(4)assign 组件:提供简单、方便的标准库容器赋值或初始化服务,避免为了赋值或初始化一个容器而重复调用insert、push_back方法;
(5)swap 组件:优化后的swap函数;
(6)singleton 组件:单例模式,实现这种模式的类在程序生命周期内只能有且仅有一个实例;
(7)tribool 组件:三态bool类型,包括true、false、indeterminate(未知,不肯定)三种状态;
(8)operators 组件:运行用户在本身的类里面仅定义少许的操做符,就能够方便地自动生成其余操做符重载,并且保证正确的语义实现,如一个类只须要定义==和<操做符,就能够自动生成!=、>、<=、>=这四种操做符;
(9)exception 组件:Boost定义的异常类,是对C++标准中的std::exception异常类的改进与强化;
(10)uuid 组件:表示和生成UUID(通用惟一识别码)
(11)config 组件:Boost开发者(而不是库使用者,即咱们)工具,因此不用管;
(12)utility 库:这不是一个有统一主题的Boost库,包含若干很小但颇有用的组件工具;
包括 lexical_cast、format、string_ref、string_algo、tokenizer 和 xpressive6 个库,其中:
(1)lexical_cast 和 format 主要关注于字符串的表示,能够将数值转化为字符串,对输出作精确的格式化。
(2)string_ref 提供了一个只读视图,能够避免字符串的拷贝代价,是更好的 const std::string& 的替代品。
(3)string_algo、tokenizer 和 xpressive 三个库主要关注于字符串的处理,提供了大量的字符串处理函数。
这一类库主要是为了加强C++程序的bug检测,主要包括assert、static_assert、lightweight_test和test4个库。
(1)assert 库:提供运行时的断言,对C++标准中的assert进了强化;
(2)static_assert 库:提供编译期诊断;
(3)lightweight_test 和 test 库:提供单元测试功能
Boost容器库是对C++标准容器库的扩展,主要包括10个容器(数据结构):array、dynamic_bitset、unordered、bimap、circular_buffer、tuple、any、variant、multi_array、property_tree。
(1)array 库:对C++内建数组的封装,是C++11标准的一部分
(2)dynamic_bitset 库:结合了vector
(3)unordered 库:散列容器类(读者能够自行百度)
(4)bimap 库:相似与C++标准库的关联容器,可是标准关联容器只是单向关联(映射),而bimap提供双向映射的能力;
(5)circular_buffer 库:大小固定的循环缓冲区;
(6)tuple 库:元祖,对比与C++标准库的pair类型,tuple能够容纳不一样数目元素,并且每一个元素的类型均可以不同;
(7)any 库:只能容纳一个元素的容器,即该容器size固定为1,可是这个元素的类型能够任意;
(8)variant 库:对C++中union数据结构的扩展和加强,union只能容纳内置类型的数据,而variant没有这个限制;
(9)multi_array 库:多维数组(容器),相似vector<vector
(10)property_tree 库:保存了多个属性值的树形数据结构;
C++标准库(STL)中提供了大量的算法,能够对容器执行统计、查找、赋值、排序等操做,同时Boost也跟进标准库,提供了一些其余算法的实现,这里主要介绍三个算法组件:foreach、minmax、algorithm。
(1)foreach 组件:对循环程序结构(如for循环)的编译器级别实现,不依赖与高级别编译器,即再低级别编译器上也能编译运行;
(2)minmax 组件:最大值、最小值应用;
(3)algorithm 组件:是一个算法集合,包含了不少有用的、小的算法。
C++标准库现有的用于科学计算的组件仍是没法知足现代科学的计算要求,Boost库就对这一方面的库进行补充,主要包括:math.constants、integer、rational、ratio、crc和random6个库。
(1)math.constants 库:主要包含一些数学常数,如根号二、π等;
(2)integer 库:提供哟管整数处理的头文件和类,具备良好的可移植性;
(3)rational 库:实现了有理数
(4)ratio 库:表述生活中的一些经常使用的单位表示;
(5)crc 库:就是计算机网络中的循环冗余校验码,是一种错误检测机制;
(6)random 库:真正的随机数生成器。
Boost提供了必定的跨平台移植功能,这些库屏蔽了操做系统的底层细节,主要包括:system、chrono、cpu_timer、filesystem、program_options库;
(1)system 库:使用轻量级的对象封装了操做系统底层的错误代码和错误信息,使调用操做系统功能的程序能够被很容易地移植到其余系统。
(2)cpu_timer 库:支持对 CPU 时间片进行高进度的计时;
(3)filesystem 库:是一个可移植的文件系统操做库;
(4)program_options 库:提供相似于 gcc 那样功能强大的命令行参数处理功能;
主要涉及函数与函数对象,总共4个库:ref、bind、function、signals2
(1)ref 库:提供引用语义;
(2)bind 库:提供参数绑定功能
(3)function 库:函数对象”容器“
(4)signals2 库:基于Boost库中的另外一个库signals实现了线程安全的观察者模式;
Boost提供多个用于并发编程的库或组件来弥补C++标准库在一块的短板,主要包括3个库:atomic、thread、asio。
(1)atomic 库:实现了C++11标准库定义的院子操做库,对不一样计算机硬件的底层操做原语进行封装,提供跨平台的原子操做功能;
(2)thread 库:已经成为C++11的标准,为C++增长了线程处理的能力,它提供简明清晰的互斥量、线程、条件变量等概念,能够很容易地建立多线程应用程序,实现并发编程。
(3)asio 库:主要用于网络编程,封装了大量的Socket API,提供了一个现代C++风格的网络编程接口