为 CmakeLists.txt 添加 boost 组件

boost 具有很好的平台独立性, 因此会作为首选的 api 来完成特定的功能.

我在项目中使用了 boost 的 filesystem 功能来获取程序的运行目录.

#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 常用组件

另外, 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.

Boost常用库概览

1、时间与日期 timer, date_time, chrono

C++ 一直以来缺乏对时间和日期的处理能力,而时间和日期又是现实生活中经常遇到的,所以C++程序员不得不求助于C,使用笨拙的结构和函数。无法忍受这一情形的程序员则手工构造了自己的首先以满足开发所需,这就导致了很多程序员在“重复的造轮子”Boost提供了 timer、date_time、chrono 三个库解决了上述问题,避免程序员重复造轮子。

(1)timer 库提供简易的度量时间和进度显示功能,可以用于性能测试等需要计时的任务,对于大多数的情况他足够用。

(2)date_time 库提供全面且灵活的日期时间库,目的就是简化复杂的日期和时间处理工作。

(3)chrono 库提供“计算机世界”的时间处理服务,实现计算机系统的精确计时。

2、内存管理 system

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.

(1) system 库.

3、实用工具库

这不是一个整体库,只是把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库,包含若干很小但很有用的组件工具;

4、字符串与文本处理

包括 lexical_cast、format、string_ref、string_algo、tokenizer 和 xpressive6 个库,其中:

(1)lexical_cast 和 format 主要关注于字符串的表示,可以将数值转化为字符串,对输出做精确的格式化。

(2)string_ref 提供了一个只读视图,可以避免字符串的拷贝代价,是更好的 const std::string& 的替代品。

(3)string_algo、tokenizer 和 xpressive 三个库主要关注于字符串的处理,提供了大量的字符串处理函数。

5、正确性与测试

这一类库主要是为了增强C++程序的bug检测,主要包括assert、static_assert、lightweight_test和test4个库。

(1)assert 库:提供运行时的断言,对C++标准中的assert进了强化;

(2)static_assert 库:提供编译期诊断;

(3)lightweight_test 和 test 库:提供单元测试功能

6、容器与数据结构

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和bitset二者的有点,既能动态增长,又方便进行位运算;

(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 库:保存了多个属性值的树形数据结构;

7、算法

C++标准库(STL)中提供了大量的算法,可以对容器执行统计、查找、赋值、排序等操作,同时Boost也跟进标准库,提供了一些其他算法的实现,这里主要介绍三个算法组件:foreach、minmax、algorithm。

(1)foreach 组件:对循环程序结构(如for循环)的编译器级别实现,不依赖与高级别编译器,即再低级别编译器上也能编译运行;

(2)minmax 组件:最大值、最小值应用;

(3)algorithm 组件:是一个算法集合,包含了很多有用的、小的算法。

8、数学与数字

C++标准库现有的用于科学计算的组件还是无法满足现代科学的计算要求,Boost库就对这一方面的库进行补充,主要包括:math.constants、integer、rational、ratio、crc和random6个库。

(1)math.constants 库:主要包含一些数学常数,如根号2、π等;

(2)integer 库:提供哟管整数处理的头文件和类,具有良好的可移植性;

(3)rational 库:实现了有理数

(4)ratio 库:表述生活中的一些常用的单位表示;

(5)crc 库:就是计算机网络中的循环冗余校验码,是一种错误检测机制;

(6)random 库:真正的随机数生成器。

9、操作系统相关

Boost提供了一定的跨平台移植功能,这些库屏蔽了操作系统的底层细节,主要包括:system、chrono、cpu_timer、filesystem、program_options库;

(1)system 库:使用轻量级的对象封装了操作系统底层的错误代码和错误信息,使调用操作系统功能的程序可以被很容易地移植到其他系统。

(2)cpu_timer 库:支持对 CPU 时间片进行高进度的计时;

(3)filesystem 库:是一个可移植的文件系统操作库;

(4)program_options 库:提供类似于 gcc 那样功能强大的命令行参数处理功能;

10、函数与回调

主要涉及函数与函数对象,总共4个库:ref、bind、function、signals2

(1)ref 库:提供引用语义;

(2)bind 库:提供参数绑定功能

(3)function 库:函数对象”容器“

(4)signals2 库:基于Boost库中的另一个库signals实现了线程安全的观察者模式;

11、并发编程

Boost提供多个用于并发编程的库或组件来弥补C++标准库在一块的短板,主要包括3个库:atomic、thread、asio。

(1)atomic 库:实现了C++11标准库定义的院子操作库,对不同计算机硬件的底层操作原语进行封装,提供跨平台的原子操作功能;

(2)thread 库:已经成为C++11的标准,为C++增加了线程处理的能力,它提供简明清晰的互斥量、线程、条件变量等概念,可以很容易地创建多线程应用程序,实现并发编程。

(3)asio 库:主要用于网络编程,封装了大量的Socket API,提供了一个现代C++风格的网络编程接口

参考

1. Boost常用组件概览

为 CmakeLists.txt 添加 boost 组件的更多相关文章

  1. Ubuntu 16.04源码编译boost库 编写CMakeLists.txt | compile boost 1.66.0 from source on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/d5d4a460/,欢迎阅读! compile boost 1.66.0 from source on ubuntu 16.04 G ...

  2. CMakeLists.txt添加多个源代码

    coos2d-x 3.17.2 C++工程,安卓编译使用CMake,按照模板给的写法,只能一个一个源文件添加:如果需要添加大量的C++源代码,这种方式肯定不可取:原来的写法: 1 list(APPEN ...

  3. cmakelists.txt中配置openg环境出现: undefined reference to symbol 'glLightfv'

    cmakelists.txt中配置openg环境出现: undefined reference to symbol 'glLightfv' 解决方法: 在cmakelists.txt添加 find_p ...

  4. 在ros功能包CMakeLists.txt中获取所在功能包的路径 便于添加第三方库的相对路径

    在 ros 功能包中要使用第三方的动态库,将其放在系统默认库路径和使用绝对路径均不可取,这样的话可移植性较差,将该功能包移到其它电脑时要重新配置依赖库的路径,太麻烦了. 于是找到下面这个方法,解决了R ...

  5. [CMAKE] 详解CMakeLists.txt文件

    [快速查询]https://cmake.org/cmake/help/v2.8.8/cmake.html#section_Commands 1 CMake简介 CMake是跨平台编译工具,比make更 ...

  6. Ros学习——Cmakelists.txt文件解读

    1.过程 .Required CMake Version (cmake_minimum_required) //CMake 需要的版本 .Package Name (project()) //#定义工 ...

  7. cmake 学习-cmakelists.txt

    #设置库的路径,电脑里有qt4以及qt5,使用qt5时 设置qt5的环境变量(路径). set(CMAKE_PREFIX_PATH $ENV{QTDIR}) #设定工程名称 Project(prona ...

  8. 简单CMakeLists.txt文件

    #CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(server) #添加包含目录 include_directories(./in ...

  9. 使用CMakeLists.txt 判断编译器是否支持C++11

    #将下面的内容添加到CMakeLists.txt当中include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11&quo ...

随机推荐

  1. Mysql-5.7主从部署-yum方式

    一.环境准备 # rpm -qa |grep mariadb |xargs yum remove -y # setenforce 0(临时关闭),(selinux配置文件:SELINUX=disabl ...

  2. 计算机网络-5-10-TCP运输连接管理

    TCP的运输连接管理 TCP是面向连接的通信,运输连接是用来传送TCP报文的,TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输连接有三个阶段,即:建立连接,数据传送,连接释 ...

  3. JSP中的请求转发与重定向

    在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建 ...

  4. 在TCP文件传输中如何判断java流的末尾

    感谢前辈们的解答:https://bbs.csdn.net/topics/280085530 问题描述: 服务端向客户端发送数据流,服务端发完了数据不关闭流. 我在客户端读流,我无法读到-1,所以无法 ...

  5. indexOf() 和 lastIndexOf()

    一,定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索 ...

  6. Jenkins--持续集成及Jenkins介绍

    Jenkins--持续集成及Jenkins介绍 目录 Jenkins--持续集成及Jenkins介绍 一.持续集成及Jenkins介绍 1. 软件开发生命周期 1.1 需求分析 1.2 设计 1.3 ...

  7. Azure AD Domain Service(二)为域服务中的机器配置 Azure File Share 磁盘共享

    一,引言 Azure File Share 是支持两种认证方式的! 1)Active Directory 2)Storage account key 记得上次分析的 "Azure File ...

  8. tip6:idea 开发工具使用

    使用idea开发工具过程中,各种个性化设置或快捷方式使用汇总 1.设置默认maven为本地 2.编写代码时提供完整的参数提示信息 3.编辑器列模式 使用alt+鼠标左键,鼠标下移即可.使用版本idea ...

  9. 分布式缓存NCache使用

    NCache作为缓存优点币Redis有优势,但是收费的所以选用的不多吧.下面简单实操一下: 首先官网下载组件NCache Download Center (alachisoft.com),这里选择企业 ...

  10. 开源爱好者月刊《HelloGitHub》第 71 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...