CMake之ExternalProject安装boost

这是CMake中用于管理第三方库的命令。本文使用的CMake版本是3.22.1。
文本介绍了ExternalProject的CMake命令,并且基于此安装了boost。

官方文档:https://cmake.org/cmake/help/v3.22/module/ExternalProject.html

这个库需要include(ExternalProject)

ExternalProject_Add

定义一个target,这个target包括以下的步骤:

  1. download
  2. update/patch
  3. configure
  4. build
  5. install
  6. test

这些步骤会顺序执行。configure、build、install都有默认操作,这些默认操作是针对构建支持CMake的第三方库的。如果安装的第三方库不支持CMake,有特定的配置、构建流程,则需要覆盖这些构建步骤。

download

URL

download内有很多参数,这里主要讲URL。URL支持指定网络压缩包的url,也支持本地的压缩包。

这里提供了个boost本地压缩包的案例(正常安装boost还需要配置其他参数,在后面章节会陆续加入):

include(ExternalProject)
SET(DOWNLOAD_DIR "/root/downloads")
SET(BOOST_PATH ${DOWNLOAD_DIR}/boost_1_78_0.tar.gz)
ExternalProject_Add(boost
  URL               "${BOOST_PATH}"
)

上面URL只有一个本地路径,但根据文档,自从3.7版本,URL可以提供多个url。如果提供了多个url,会依次尝试,直到其中一个成功。
因为我目前网络不方便,就不放多url的案例了。

URL_MD5

顾名思义,用于校验压缩包的MD5值。

include(ExternalProject)
SET(DOWNLOAD_DIR "/root/downloads")
SET(BOOST_PATH ${DOWNLOAD_DIR}/boost_1_78_0.tar.gz)
SET(BOOST_MD5 c2f6428ac52b0e5a3c9b2e1d8cc832b5)
ExternalProject_Add(boost
  URL               "${BOOST_PATH}"
  URL_MD5           "${BOOST_MD5}"
)

如果压缩包和指定md5值不匹配,则会报错。

安装路径

PREFIX

用于配置下载、解压、安装等路径。
PREFIX相当于配置了整体的根目录,其他的路径会基于PREFIX自动适配。
当然其他路径也可以按需自由配置。
在这里插入图片描述

BUILD_IN_SOURCE

如PREFIX章节的截图所示,SOURCE_DIR和BINARY_DIR是不同路径的。
但是对于boost而言,首先boost不是基于CMake来构建的,其次boost的安装过程大概为:
1、bootstrap.sh
2、b2 install
在执行b2 install的时候,会依赖之前解压至SOURCE_DIR的文件(boost-build.jam),因此希望b2(BINARY_DIR)和解压路径(SOURCE_DIR)是同一个路径。在执行完bootstrap.sh之后,b2是会被放到BINARY_DIR中的,BUILD_IN_SOURCE的作用就是让BINARY_DIR等于SOURCE_DIR。
在这里插入图片描述
因此目前boost的安装内容为:

include(ExternalProject)
SET(DOWNLOAD_DIR "/root/downloads")
SET(BOOST_PATH ${DOWNLOAD_DIR}/boost_1_78_0.tar.gz)
SET(BOOST_MD5 c2f6428ac52b0e5a3c9b2e1d8cc832b5)
ExternalProject_Add(boost
  URL               "${BOOST_PATH}"
  URL_MD5           "${BOOST_MD5}"
  PREFIX            "${CMAKE_CURRENT_BINARY_DIR}"
  # 因为执行b2的时候,需要在同目录下读取boost-build.jam,因此BUILD_IN_SOURCE
  BUILD_IN_SOURCE   true
)

COMMAND

如一开始说的,会有configure、build、install步骤。也就对应CONFIGURE_COMMANDBUILD_COMMANDINSTALL_COMMAND
因为boost不依赖CMake,所以需要覆盖这三个COMMAND。
覆盖的命令也就是boost正常安装的步骤了。这里先放上完整的CMake配置:

include(ExternalProject)
SET(DOWNLOAD_DIR "/root/downloads")
SET(BOOST_PATH ${DOWNLOAD_DIR}/boost_1_78_0.tar.gz)
SET(BOOST_MD5 c2f6428ac52b0e5a3c9b2e1d8cc832b5)
SET(BOOST_CONFIGURE <SOURCE_DIR>/bootstrap.sh --prefix=<SOURCE_DIR>)
SET(BOOST_INSTALL <SOURCE_DIR>/b2 install --prefix=<BINARY_DIR>/../build)
ExternalProject_Add(boost
  URL               "${BOOST_PATH}"
  URL_MD5           "${BOOST_MD5}"
  PREFIX            "${CMAKE_CURRENT_BINARY_DIR}"
  # 因为执行b2的时候,需要在同目录下读取boost-build.jam,因此BUILD_IN_SOURCE
  BUILD_IN_SOURCE   true
  CONFIGURE_COMMAND "${BOOST_CONFIGURE}"
  BUILD_COMMAND       ""
  INSTALL_COMMAND   "${BOOST_INSTALL}"
)

1、SET里面的<SOURCE_DIR><BINARY_DIR>,是用于在ExternalProject_Add中获取路径变量的。
2、BOOST_INSTALL中的--preifx指定了项目内的安装路径,而非默认安装至/usr/local中,是为了让这个第三方库不影响外部,这里可酌情修改。
3、BUILD_COMMAND中没有需要用的命令,但为了让默认的命令失效,也需要覆盖一个空命令。
4、这个名为boost的target,在cmake的时候是没有操作的,要在make之后才能会执行 解压、md5判断… 等一系列操作。(这部分卡了我很久,当时一直很困惑为什么cmake完没反应)当然这也印证了我对CMake还不够熟悉,CMake只是预处理器,真正的执行者是make

以上就是基于ExternalProject_Add安装boost的内容了,基于这个案例,安装了一个非CMake的第三方库,这样能接触到更多的内容,相信后面安装CMake库会更容易上手。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CMake是一个跨平台的构建系统,它可以帮助你简化在不同操作系统和编译器上配置和构建项目的过程。vcpkg是一个开源的C++包管理工具,用于简化C++库的获取、构建和管理。 要在CMake中使用vcpkg安装Boost(一个流行的C++库集合),你可以按照以下步骤操作: 1. **安装vcpkg**: 如果你还没有安装vcpkg,首先需要从其官方GitHub仓库下载并安装它。在命令行中运行: ``` git clone https://github.com/microsoft/vcpkg.git cd vcpkg ./vcpkg install ``` 2. **配置CMake找到vcpkg**: 在你的项目根目录下,添加一个`CMakeLists.txt`文件。在其中添加以下内容,告诉CMake去哪里寻找vcpkg安装的库: ```cmake set(VCPKG_ROOT ${CMAKE_SOURCE_DIR}/vcpkg) # 修改为你的vcpkg实际路径 include(vcpkg.cmake) vcpkg_add_defaults(yes) find_package(Boost REQUIRED COMPONENTS <list_of_boost_components>) # 替换<list_of_boost_components>为你需要的Boost组件,如filesystem, thread等 ``` 请确保将`<list_of_boost_components>`替换为你项目所需的Boost组件。 3. **生成构建文件**: 在`CMakeLists.txt`目录下运行CMake生成构建脚本: ``` cmake . ``` 4. **构建项目**: 使用生成的构建脚本来编译你的项目: ``` cmake --build . --config Release # 或者Debug,根据你的需求 ``` 5. **链接Boost库**: 在你的源代码中,现在你可以像使用其他标准库一样使用`Boost::<component_name>`了。 相关问题: 1. vcpkg除了安装Boost,还能管理哪些其他C++库? 2. 如何查看安装的vcpkg库列表? 3. 当我的项目依赖多个版本的同一个库时,vcpkg如何处理?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值