为 CmakeLists.txt 添加 boost 组件

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

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

  1. #include <boost/filesystem/path.hpp>
  2. #include <boost/filesystem/operations.hpp>
  3. int main()
  4. {
  5. ...
  6. std::string exePath = boost::filesystem::initial_path<boost::filesystem::path>().string();
  7. ...
  8. return 0;
  9. }

但编译的时候提示如下错误:

  1. In function `__static_initialization_and_destruction_0(int, int)':
  2. process_template.cpp:(.text+0x1d09c): undefined reference to `boost::system::generic_category()'
  3. process_template.cpp:(.text+0x1d0a8): undefined reference to `boost::system::generic_category()'
  4. process_template.cpp:(.text+0x1d0b4): undefined reference to `boost::system::system_category()'
  5. CMakeFiles/process.dir/src/process_template.cpp.o: In function `boost::filesystem::initial_path()':
  6. process_template.cpp:(.text._ZN5boost10filesystem12initial_pathEv[_ZN5boost10filesystem12initial_pathEv]+0x19): undefined reference to `boost::filesystem::detail::initial_path(boost::system::error_code*)'
  7. collect2: error: ld returned 1 exit status

很明显是没有将对应的库链接进来. 因此, 需要在 CmakeLists.txt 中添加关于 boost 的链接选项.

  1. cmake_minimum_required(VERSION 2.8)
  2. project( process )
  3. SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11")
  4. find_package(Boost REQUIRED COMPONENTS
  5. # regex
  6. filesystem # 我的工程中只使用了 boost 的 filesystem 功能,因此这里只有一个组件
  7. )
  8. if(NOT Boost_FOUND)
  9. message("Not found Boost")
  10. endif()
  11. include_directories(${Boost_INCLUDE_DIRS})
  12. message("${Boost_INCLUDE_DIRS}")
  13. message("${Boost_LIBRARIES}")
  14. add_executable( process src/process_template.cpp )
  15. target_link_libraries(process ${Boost_LIBRARIES})

然后重新 make, 就可以顺利通过了.

  1. [ 50%] Linking CXX executable process
  2. [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. 实际工程中加快 Java 代码编写的小提示

    这里我简单谈谈 Java 语法在编程效率方面的弱势,以及如何补救. 一.集合的快速创建 C# 是少数拥有集合字面值(又叫初始化表达式)的静态语言之一. var list = new List<i ...

  2. BeanUtils JavaBean 工具包使用

    感谢原文作者:小老弟 原文链接:https://www.cnblogs.com/syncmr/p/10523576.html 目录 简介 BeanUtils类 使用示例 ConvertUtils 功能 ...

  3. JS let, var, const的用法以及区别

    本文摘自多位前辈的博文,另外还有一些我的多余补充,摘自地址已补充.非常感谢各位前辈.仅以笔记学习为目的! 深入学习ES6的知识还请访问阮一峰老师的ES6教程 如果不使用let或者const,在JS只有 ...

  4. 版本控制SVN

    为什么需要版本控制软件 代码的冻结 避免在重大的考核之前改动代码 每个稳定版本都在服务器保存进度,随时可以回退 需求频繁的变化不要改动稳定的代码,不要改别人写好的代码 为什么需求会变化?有时候产品自己 ...

  5. Idea快捷键---根据自己使用情况持续更新

    查看接口的实现类 -->ctrl+alt+b 查看继承关系 -->ctrl+h 快速查看上次查看代码的位置: -->ctrl+alt+方向键(注意与intel显卡快捷键的冲突,如有冲 ...

  6. endl与\n的区别

    看C++Primer的时候看到的,然后去百度了一下: 比较明白的解释: 1.区别在于: \n只代表换行的转义字符 endl除了代表换行,还紧跟着清出缓冲槽 2.接下来我们看一下具体内容的辨析: 要明白 ...

  7. DatabaseMetaData

    getColumns public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern ...

  8. c++类模板与其他

    static static的成员不再单独属于一个对象,他是单独的保存在内存的某个地址,也就只有一份.所以在设计程序的时候要看这个东西是不是只需要一份. static函数和一般的函数一样,在内存中只有一 ...

  9. Ubuntu18 用新用户登录后退格键/方向键/制表键 乱码

    Ubuntu18新建用户后,用新用户登录,此时 退格键Backspace 变成了 ^H,且方向键.制表键.Del键等均失效 这样会造成很多的麻烦,解决方式有两种: 方式1:Ctrl + Backspa ...

  10. 从零开始实现一个分布式RPC框架

    该rpc框架是一个mini版的dubbo.学习rpc之前,建议先了解NIO,Netty和Dubbo等知识.请移步网络编程 前言:(借用阿里大佬的一段话) 为什么要自己写一个RPC框架,我觉得从个人成长 ...