【Boost】CMake中引用Boost库
概述
在macOS开发时常常使用Boost库,若项目使用CMake进行组织管理和编译,需要掌握在CMake中实现Boost库的引用的基本语法。本片博客结合自己在实际使用过程中的经验进行总结,以期回顾和进行阶段总结。
CMakeLists.txt编写
find_package
通过调用find_package可以找到头文件和所需要的库文件或者是一个CMake打包配置文件。
find_package(Boost
[version] [EXACT] # 可选项,最小版本或者确切所需版本
[REQUIRED] # 可选项,如果找不到所需库,报错
[COMPONENTS <libs>...] # 所需的库名称,比如说. "date_time" 代表 "libboost_date_time"
)
示例
find_package(Boost 1.70.0 REQUIRED
COMPONENTS system filesystem thread)
运行完后可以得到很多变量,下面列了一些主要的。
Boost_FOUND - 如果找到了所需的库就设为true
Boost_INCLUDE_DIRS - Boost头文件搜索路径
Boost_LIBRARY_DIRS - Boost库的链接路径
Boost_LIBRARIES - Boost库名,用于链接到目标程序
Boost_VERSION - 从boost/version.hpp文件获取的版本号
Boost_LIB_VERSION - 某个库的版本
搜索路径设置
若Boost库是自定义安装路径,可以在搜索package之前,通过设置一些变量来帮助boost库的查找。
BOOST_ROOT - 首选的Boost安装路径
BOOST_INCLUDEDIR - 首选的头文件搜索路径 e.g. <prefix>/include
BOOST_LIBRARYDIR - 首选的库文件搜索路径 e.g. <prefix>/lib
Boost_NO_SYSTEM_PATHS - 默认是OFF. 如果开启了,则不会搜索用户指定路径之外的路径
用例
假如目标程序foo需要链接Boost库regex 和system,编写如下的CMakeLists文件
# CMakeLists.txt
project(tutorial-0)
cmake_minimum_required(VERSION 3.7)
set(CMAKE_CXX_STANDARD 14)
set(BOOST_ROOT /usr/local/install/boost_1_70_0) // 设置boost库搜索路径
set(Boost_NO_SYSTEM_PATHS ON) // 只搜索上语句设置的搜索路径
find_package(Boost COMPONENTS regex system REQUIRED)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
add_executable(foo foo.cpp)
target_link_libraries (foo ${Boost_LIBRARIES})
endif()
- 通过设置BOOST_ROOT来设置首选的搜索路径
- 通过MESSAGE函数把查找的结果都打印了出来
-- Boost_INCLUDE_DIRS = /usr/local/install/boost_1_70_0/include.
-- Boost_LIBRARIES = /usr/local/install/boost_1_70_0/lib/libboost_regex.so;/usr/local/install/boost_1_62_0/lib/libboost_system.so.
-- Boost_LIB_VERSION = 1_70.
Boost动态库链接
若项目包含多个子模块,且子模块只用到顶层模块find_package找到的部分库,则可以使用下述语句实现只链接子模块所需要的Boost动态库
target_link_libraries(foo Boost::regex) // 只使用regex
Boost头文件库链接
在Boost库中有部分库只用头文件实现,并没有相应的动态库,若使用这部分库可以通过以下语句实现:
target_link_libraries(foo Boost::boost)
# or
target_include_directories(${Boost_INCLUDE_DIRS})
【Boost】CMake中引用Boost库的更多相关文章
- VC中引用第三方库,常见的库冲突问题
Q:VC中引用第三方库,常见的库冲突问题 环境:[1]VS2008 [2]WinXP SP3 A1(方法一): [S1]第三方库(Binary形式的)如果同主程序冲突,则下载第三方库的源码[S2]保持 ...
- 在项目中引用GreenDroid库
1.下载GreenDroid库 首先,我们得从Git上下载这个库,我用的是git for windows下载的.先下载,安装.安装完后,打开git for windows ,直接将浏览器中GreenD ...
- VS中引用第三方库的方法(配置sqlite数据库)
我们在编写程序时,,不可避免的会使用第三方的库文件,很少使用源文件(.cpp),大部分是使用对类进行声明的头文件和封装了类的链接库(静态lib或动态dll),比如我们写程序用的iostream这个库, ...
- [学习笔记] 在Eclipse中添加用户库 Add User Libraries ,在项目中引用用户库
如果还没有安装Eclipse, 则请参考前文: [学习笔记] 下载.安装.启动 Eclipse(OEPE) 添加用户库 本文主要介绍在项目中直接使用第三方库的情况.就是把第三方的jar文件直接放到某 ...
- (转)HelloWorld CMake CMake中构建静态库与动态库及其使用
继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello ...
- Angular-Cli中引用第三方库
最近在学习angular(AngularJS 2),根据教程使用angular-cli新建项目, 然而在添加JQuery和Bootstrap第三方库时遇到了问题... 初试 我最初的想法是直接将相对路 ...
- cmake配置项目引用动态库
note 本文将介绍使用FIND_PACKAGE配置项目动态库的方法 cmake version: 3.18 platform: win10 20H2 概述 创建了一个动态库,再由主项目调用该动态库. ...
- eclipse 引用静态库设置选项
环境说明: 静态库文件项目:engine C++ 项目:server 在server项目中引用静态库的库文件libEngine.a 需要设置如图选项,才能引用静态库项目里的文件 主要设置: 1.inc ...
- Flutter如何引用第三方库并使用
Flutter如何引用第三方库并使用 https://www.jianshu.com/p/bbda7794345e Flutter官网点击访问Flutter教程(一)Flutter概览Flutter教 ...
- Qt中使用Boost库
关于boost库的编译,请看https://www.cnblogs.com/HackerArt/p/10539516.html 网上可以查到很多介绍qt使用库文件的教程,但是大多都没有注意到,qt中支 ...
随机推荐
- 黑客玩具入门——5、继续Metasploit
1.利用FTP漏洞并植入后门 实验靶机:Metasploitable2. 实践: 使用nmap扫描目标靶机 nmap -sV xxx.xxx.xxx.xxx(目标ip) 生成linux系统后门 msf ...
- JSON多层嵌套复杂结构数据扁平化处理转为行列数据
背景 公司的中台产品,需要对外部API接口返回的JSON数据进行采集入湖,有时候外部API接口返回的JSON数据层级嵌套比较深,举个栗子: 上述的JSON数据中,最外层为请求返回对象,data里面包含 ...
- [ICPC2015WF] Tours
题目描述 The Arca Carania Mountain national park is opening up for tourist traffic. The national park ha ...
- [CF1854D] Michael and Hotel
题目描述 Michael and Brian are stuck in a hotel with $ n $ rooms, numbered from $ 1 $ to $ n $ , and nee ...
- JUC_start和run
类型: run方法是同步 而start是异步 作用: run方法的作用是存放任务代码 ,start的方法是启动线程 线程数量方面: 执行run方法,他不会产生新线程,而执行start方法hi产生新 ...
- 【YOLOv5】实现扑克牌的点数识别
前言 其实年初的时候,我也跟着别人的源码,用 Tensoflow 实现过扑克牌的目标检测.虽然也通过博文的方式记录了,但是那个项目使用的 TF 版本比较旧,自身对 TF 并不熟.后期如果说要升级或修改 ...
- bash shell笔记整理——less命令
less命令的作用 less和cat.more最大的差别在于不会一次性加载整个文件,速度比较快!另外less具备翻页功能,可以向上/向下翻页! 语法 less [选项] [文件名] *选项* *使用说 ...
- Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
学习基础知识 掌握 Go 语言的常见概念,如变量.循环.条件语句.函数.数据类型等等.深入了解 Go 基础知识的好起点是查阅 Go 官方文档 文章链接:Go 编程语言详解:用途.特性.与 Python ...
- ElasticSearch之cat aliases API
执行aliases命令,如下: curl -X GET "https://localhost:9200/_cat/aliases?pretty&v=true" --cace ...
- 【Azure APIM】APIM 策略语句如何来设置多个Cookie值让浏览器保存
问题描述 在APIM的 <return-response> 策略中,设置Cookie值,因为需要设置多个Cookie值,使用下面两种方式都只能保存一个Cookie值: 方式一:把多个coo ...