目錄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++風格的網絡編程接口