CMake 引入第三方库

2023-05-16

CMake 引入第三方库

在 CMake 中,如何引入第三方库是一个常见的问题。在本文中,我们将介绍 CMake 中引入第三方库的不同方法,以及它们的优缺点。

1. 使用 find_package 命令

在 CMake 中,使用 find_package 命令是最简单和最常用的方式来引入已安装的外部库。例如,我们可以使用以下命令来引入 OpenSSL 库:

find_package(OpenSSL REQUIRED)

在这个例子中,CMake 将查找已安装的 OpenSSL 库,并将其链接到我们的项目中。当然,我们也可以通过设置变量来指定 OpenSSL 的路径:

set(OPENSSL_ROOT_DIR /path/to/openssl)
find_package(OpenSSL REQUIRED)

使用 find_package 命令的主要优点是它能够自动查找和链接已经安装的库,这使得构建过程更加简单和直观。

2. 使用 add_subdirectory 命令

在某些情况下,我们可能需要修改外部库的源代码。此时,我们可以将外部库的源代码添加到我们的项目中,然后使用 add_subdirectory 命令来构建外部库。例如,我们可以使用以下命令来引入 JsonCpp 库:

add_subdirectory(/path/to/jsoncpp)
target_link_libraries(myapp PRIVATE jsoncpp_lib)

在这个例子中,我们将 JsonCpp 库的源代码添加到我们的项目中,并将 jsoncpp_lib 目标链接到我们的应用程序中。在构建我们的项目时,CMake 将自动构建 JsonCpp 库,并将其链接到我们的应用程序中。

使用 add_subdirectory 命令的主要优点是,它能够更方便地管理外部库的源代码。我们可以将外部库的源代码包含在我们的版本控制系统中,以便更好地管理和维护代码。但是,使用此方法需要手动管理外部库的源代码,因此更新可能会导致您的项目中出现构建问题。

3. 使用 ExternalProject_Add 命令

下面是一个使用 ExternalProject_Add 命令下载和构建 Google Test 库的例子。在这个例子中,我们将下载 Google Test 库的源代码,并将其作为独立项目构建。使用 ExternalProject_Add 命令的主要优点在于,它能够将外部项目的构建过程与主项目的构建过程隔离开来,从而更加灵活地控制外部项目的行为和依赖关系。

cmake_minimum_required(VERSION 3.11)

include(ExternalProject)

# 设置下载的 URL 和 SHA-256 哈希值
set(GTEST_VERSION "1.11.0")
set(GTEST_URL "https://github.com/google/googletest/archive/refs/tags/release-${GTEST_VERSION}.tar.gz")
set(GTEST_HASH "d722feaac7d6b2270c2f6896d364c3712cf18e9cd963c1e7f56c38e936e13fa1")

# 下载和解压 Google Test 库的源代码
ExternalProject_Add(
  googletest
  PREFIX "${CMAKE_CURRENT_BINARY_DIR}/googletest"
  URL "${GTEST_URL}"
  URL_HASH SHA256=${GTEST_HASH}
  DOWNLOAD_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/download"
  SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/src"
  BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/build"
  CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/googletest/install"
)

# 将 Google Test 库的头文件和库文件链接到主项目中
set(GTEST_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest/install/include")
set(GTEST_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/googletest/install/lib/libgtest.a")
set(GTEST_MAIN_LIBRARIES "${CMAKE_CURRENT_BINARY_DIR}/googletest/install/lib/libgtest_main.a")

target_include_directories(myproject PRIVATE ${GTEST_INCLUDE_DIR})
target_link_libraries(myproject PRIVATE ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})

在这个例子中,我们首先通过设置 GTEST_URL 和 GTEST_HASH 变量来指定要下载的 Google Test 库的版本和哈希值。然后,我们使用 ExternalProject_Add 命令来下载和解压源代码,并使用 CMake 构建 Google Test 库。这里通过设置 PREFIX、URL、URL_HASH、DOWNLOAD_DIR、SOURCE_DIR、BINARY_DIR 和 CMAKE_ARGS 等参数来指定 ExternalProject_Add 的行为。最后,我们将 Google Test 库的头文件和库文件链接到主项目中,以便在主项目中使用 Google Test 库。

4.使用FetchContent 命令

CMake 也可以通过 include(FetchContent) 命令引入第三方库。FetchContent 命令允许您从指定的 URL 或 Git 存储库中提取第三方库,并将其作为 CMake 项目的子目录构建。使用 FetchContent 命令时,您无需手动下载、解压缩或设置外部库的构建过程,CMake 会自动执行这些任务。

下面是使用 FetchContent 命令引入第三方库的示例:

include(FetchContent)

FetchContent_Declare(
  my_library
  GIT_REPOSITORY https://example.com/my_library.git
  GIT_TAG v1.0.0
)

FetchContent_GetProperties(my_library)
if(NOT my_library_POPULATED)
  FetchContent_Populate(my_library)
  add_subdirectory(${my_library_SOURCE_DIR} ${my_library_BINARY_DIR})
endif()

在这个示例中,FetchContent_Declare 命令声明了一个名为 my_library 的第三方库,并指定了其 Git 存储库的 URL 和 Git tag。然后,FetchContent_GetProperties 命令获取指定的第三方库的属性,并检查它是否已经被 FetchContent_Populate 命令所提取。如果尚未提取,FetchContent_Populate 命令将提取指定的库,并将其作为 CMake 项目的子目录进行构建。最后,add_subdirectory 命令将提取的第三方库的源代码目录和二进制目录添加到 CMake 项目中。

使用 FetchContent 命令的优点是它使得引入第三方库更加方便,并且使得与外部库的集成更加简单。同时,使用 FetchContent 命令时,您可以很容易地在您的 CMake 项目中指定外部库的版本和源代码位置。

5.总结

当引入第三方库时,CMake 提供了多种不同的方式。每种方式都有自己的优缺点,具体取决于项目的需求和环境。下面是一些不同的引入第三方库的方法及其优缺点:

1、find_package 命令
find_package 命令是一种在 CMake 项目中查找已经安装的第三方库的方法。这种方法适用于大多数开源库,因为它们通常已经被打包为二进制发行版,可以通过包管理器或官方网站下载并安装。

优点:使用已经安装的二进制发行版,构建速度快,不需要从源代码构建。

缺点:无法使用最新版本的库,需要手动安装和更新库。

2、add_subdirectory 命令
add_subdirectory 命令是一种在 CMake 项目中添加外部库源代码的方法。这种方法适用于已经包含在您的项目中的外部库,或者您需要从源代码构建外部库的情况。

优点:直接在您的项目中构建外部库,方便修改外部库源代码。

缺点:需要手动更新外部库,库的更新可能会导致项目中的构建问题。

3、ExternalProject_Add 命令
ExternalProject_Add 命令是一种将外部库作为独立项目下载和构建的方法。这种方法适用于需要与外部库进行集成,但是不想将外部库的源代码包含在您的项目中。

优点:不需要在您的项目中包含外部库的源代码,允许更好的代码分离和依赖管理。

缺点:需要从头开始构建外部库,构建速度可能很慢。同时,需要手动更新外部库,库的更新可能会导致项目中的构建问题。

4、FetchContent 命令
FetchContent 命令是一种从外部 URL 或 Git 存储库中提取源代码的方法。这种方法适用于不需要将外部库作为独立项目构建的情况,但是需要从源代码构建外部库。

优点:与 ExternalProject_Add 相比,构建速度更快,而且不需要独立的构建目录。

缺点:需要手动更新外部库,库的更新可能会导致项目中的构建问题。

总之,选择适当的方法取决于项目的需求和环境。对于大多数情况,find_package 命令是首选方法,因为它是最简单和最常用的方式。对于需要修改外部库源代码的情况,使用 add_subdirectory 命令可以更方便地管理代码。对于需要将外部库作为独立项目构建的情况,使用 ExternalProject_Add 命令是一种好的选择。这种方法的优点在于,它能够将外部库的构建过程与您的项目分离,使代码更易于管理和维护。不过,这种方法的缺点是需要手动更新外部库,更新可能会导致您的项目中出现构建问题。

如果您不需要将外部库作为独立项目构建,但是需要从源代码构建外部库,那么 FetchContent 命令是一种不错的选择。这种方法与 ExternalProject_Add 相比,构建速度更快,而且不需要独立的构建目录。但是,需要注意的是,需要手动更新外部库,更新可能会导致您的项目中出现构建问题。

综上所述,对于大多数情况,使用 find_package 命令是最简单和最常用的方式,因为它能够自动查找已经安装的外部库。对于需要修改外部库源代码的情况,使用 add_subdirectory 命令可以更方便地管理代码。对于需要将外部库作为独立项目构建的情况,使用 ExternalProject_Add 命令是一种好的选择。对于不需要将外部库作为独立项目构建,但是需要从源代码构建外部库的情况,使用 FetchContent 命令是一种不错的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake 引入第三方库 的相关文章

  • 综述 | 激光与视觉融合SLAM

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 SLAM包含了两个主要的任务 xff1a 定位与构图 xff0c 在移动机器人或者自动驾驶中 xff0c 这是一个十分重要的问题 xf
  • KITTI数据集简介与使用

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 摘要 xff1a 本文融合了Are we ready for Autonomous Driving The KITTI Vision
  • DBSCAN聚类算法原理总结

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 DBSCAN是基于密度空间的聚类算法 xff0c 在机器学习和数据挖掘领域有广泛的应用 xff0c 其聚类原理通俗点讲是每个簇类的密度
  • 深度学习GPU最全对比,到底谁才是性价比之王?

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自AI新媒体量子位 xff08 公众号 ID QbitAI xff09 搞AI xff0c 谁又没有 GPU之惑 xff1f 张
  • 使用卡尔曼滤波器进行对象跟踪时最容易遗漏什么

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 介绍 卡尔曼滤波器是一种复杂的算法 xff0c 在大多数情况下 xff0c 我们在没有完全理解其方程的情况下使用它 当我开始使用卡尔曼
  • 10分钟掌握异常检测

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 异常检测 也称为离群点检测 是检测异常实例的任务 xff0c 异常实例与常规实例非常不同 这些实例称为异常或离群值 xff0c 而正常
  • 根据图像目标深度测试距离

    clc clear close all warning off addpath 39 func 39 计算物体的深度距离 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • SLAM基础环境配置

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 转自知乎作者 xff1a 佳浩 原文链接 xff1a https zhuanlan zhihu com p 385255026 如今
  • 多传感器融合定位:基于滤波的融合方法

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 SLAM 后端的优化方式大体分为滤波和优化 近些年优化越来越成为主流 xff0c 在学习优化之前 xff0c 掌握滤波的工作原理也十分
  • 不要错过!顶会审稿人带读【大语言模型】前沿论文!

    LLaMA GLM 130B SELF INSTRUCT是三篇最新的语言模型相关的论文 xff0c 它们都展示了语言模型在不同方面的创新和突破 这三篇论文都体现了语言模型在双语 大规模 通用 快速 可复现等方面的重要进展 xff0c 对于语
  • 收藏 | 最全深度学习训练过程可视化工具

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 仅作学术分享 xff0c 不代表本公众号立场 xff0c 侵权联系删除 转载于 xff1a 编辑丨极市平台 机器学习实验室 深度学习训
  • 为什么建议大家使用 Linux 开发?真的很很很优雅!

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 编者荐语 Linux 开发不算简单 xff0c 要求同学们掌握的知识广且复杂 xff0c 有一定难度 但是同学们只要静下心来 xff0
  • favicon.ico不显示

    静态页面中 xff0c title前的favicon ico不显示的问题 原因还不详 解决办法 xff1a 清除浏览器缓存或者将favicon ico文件重命名
  • 树莓派系统镜像的下载和烧录

    一 树莓派镜像下载地址 树莓派官网的下载地址 xff1a 树莓派官网 软件安装 可在官网上下载最新的Raspbian树莓派系统 二 树莓派系统镜像烧写 准备 xff1a 一张2G以上的SD卡及读卡器 xff0c 最好是高速卡 xff0c 推
  • TF 坐标变换(已整理)

    文章目录 坐标msg消息静态坐标变换1 C 43 43 实现发布方 demo01 static pub cpp订阅方 demo02 static sub cpp 2 Python实现发布方 demo01 static pub p py订阅方
  • ROS Action通信

    文章目录 自定义action文件 类似msg和service 服务端 action01 server cpp客户端 action02 client cpp服务端 action01 server p py客户端 action02 client
  • 位姿图优化小记2021.10.18

    1 场景描述 现在有一个小车在运动 xff0c 并搭载相机或激光雷达进行建图工作 xff0c 由于SLAM的作用 xff0c 在建图的同时小车也可以进行自身的定位 xff0c 因此建立的地图的参考都是相对于自身坐标系的 xff0c 也就是每
  • 【CRAHNs】CRAHNs网络中多径环境下大规模MIMO接收信道估计均衡技术

    1 软件版本 matlab2017b 2 本算法理论知识 对于大规模MIMO xff0c 通常情况下 xff0c 采用3D MIMO信道来实现 这是由于3D MIMO一般采用大规模的二维天线阵列 xff0c 不仅天线端口数较多 xff0c
  • VINS笔记1——滤波与优化

    1 滤波 1 1 什么是滤波 这里的卡尔曼滤波实际上和信号处理里面的滤波有很大的不同 信号处理里面的滤波 xff0c 假设一个正弦信号有很多毛刺 xff0c 想要对其进行滤波滤除毛刺 信号处理里面的做法是把信号进行FFT变换到频域 xff0
  • Ubuntu设置CMake编译时使用的OpenCV版本

    文章目录 1 方法一 xff1a 统一修改CMakeLists txt文件中的OpenCV版本1 1 具体操作1 2 命令讲解1 2 1 sed命令1 2 2 xargs命令1 2 3 find命令 2 方法二 xff1a 调用cmake命

随机推荐

  • ROS中常见的msg消息类型

    文章目录 1 基本数据类型1 1 三维向量Vector3 msg1 2 标头Header msg1 3 四元数Quaternion msg1 4 空间中三维点Point msg 2 传感器数据类型2 1 Imu msg 3 机器人状态数据类
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • ros功能包安装

    正确指令 xff1a sudo apt get install ros kinetic dwa local planner 以后安装安装包 xff0c 用sudo apt get install ros kinetic 缺少的PACKAGE
  • vins-mono编译问题--rosrun launch问题

    launch is neither a launch file in package nor is a launch file name解决办法 cd catkin ws source devel setup bash catkin ws
  • 软件工程中的框架是什么?什么是框架?

    IT领域 软件工程中所说的框架是什么 xff1f 1 1 什么是框架 xff1f 软件框架 xff08 software framework xff09 的标准定义 xff1a 通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范
  • Docker容器中远程连接实现GUI图形显示的配置方法

    1 输入xhost 43 没有问题的话会提示 access control disabled clients can connect from any host 2 使用echo DISPLAY查看本地显示器localhost 会打印结果
  • HAL库 串口收发函数解析

    一 UART Receive IT 对于CubeMX生成的代码 xff0c USART1 IRQHandler void 函数为了提高中断效率采用了回调机制 xff08 业务代码可以等中断关闭了再去处理 xff0c 这样中断处理不会占用太多
  • c++调用python

    在我们的生活中 xff0c 如果我们想调用其他程序的话 xff0c 往往会需要一些额外的代码 xff0c 比如说我们要调用 python去执行某些函数 在我们使用 python的过程中 xff0c 为了能够调用其他程序 xff0c 我们往往
  • 基于simulink的svm-dtc-adrc控制建模与仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 永磁电机由于没有励磁绕组和励磁装置 xff0c 不消耗励磁功率 xff0c 对磁极设在转子的电机 如一般同步电机 还可省去滑环和电刷 随着永磁材料和控制技术的发展 xff0c 永
  • 关于自制openmv的一些建议

    从接触到openmv开始一直都想制作一块自己的openmv xff0c 包括从硬件 xff0c 到烧录程序 最开始制作的版本是openmv3 xff0c 其实openmv3并不是属于自己制作 xff0c 而是下载的硬件电路城开源的openm
  • vue3创建文件报“组件名称应该总是由多个单词组成“Component name “index“ should always be multi-word

    在项目根目录下的 eslintrc js 文件中添加 vue multi word component names off 没有该文件就创建一个 module span class token punctuation span export
  • STM32和ARM的区别?

    下面先看一张图 xff1a 这张图是我在意大利与法国合资的意法半导体公司 xff08 ST xff0c 世界几大半导体公司之一 xff09 的官网上看到的 这说明 xff0c STM32是意法半导体公司的产品 意法半导体 xff08 ST
  • OrangePi 5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备)

    OrangePi5 Docker下安装OpenWRT作软路由 xff08 同样适用于树莓派等设备 xff09 说明 本文的软路由作为家中的二级路由 xff0c 用一根网线连接主路由的LAN口和二级路由的WAN口 xff08 当主路由使用配置
  • kubernetes-----k8s入门详解

    目录 docker的编排工具 k8s的介绍 k8s的特性 pod的分类 service 网络 通信 认证与存储 插件 docker的编排工具 docker的第一类编排工具 xff08 docker三剑客 xff09 docker compo
  • ROS机械臂开发:Moveit + Gazebo仿真/Gazebo配置

    一 ROS中的控制器插件 ros control的功能 xff1a ROS为开发者提供的机器人控制中间件 包含一系列控制器接口 传动装置接口 硬件接口 控制器工具箱等等 可以帮助机器人应用功能包快速落地 xff0c 提高开发效率 ros c
  • 匿名飞控openmv寻色块解读

    作者 xff1a 不会写代码的菜鸟 时间 xff1a 2019 7 26 源码 xff1a 匿名TI板飞控源码 43 openmvH4 说明 xff1a 限于本人水平有限 xff0c 并不能写的很详细 xff0c 还望各位能够补充
  • 校验和的计算方法

    实验要求 编写一个计算机程序用来计算一个文件的16位效验和 最快速的方法是用一个32位的整数来存放这个和 记住要处理进位 xff08 例如 xff0c 超过16位的那些位 xff09 xff0c 把它们加到效验和中 要求 xff1a 1 x
  • MT7621路由器芯片/处理器参数介绍

    MT7621路由器芯片包括一个880 MHz MIPS 1004Kc CPU双核 xff0c 一个5端口10 100 1000交换机 PHY和一个RGMII 嵌入式高性能cpu可以很容易地处理高级应用程序 如路由 安全和VoIP等 MT76
  • 谈谈你对事件的传递链和响应链的理解

    一 xff1a 响应者链 UIResponser包括了各种Touch message 的处理 xff0c 比如开始 xff0c 移动 xff0c 停止等等 常见的 UIResponser 有 UIView及子类 xff0c UIViCont
  • CMake 引入第三方库

    CMake 引入第三方库 在 CMake 中 xff0c 如何引入第三方库是一个常见的问题 在本文中 xff0c 我们将介绍 CMake 中引入第三方库的不同方法 xff0c 以及它们的优缺点 1 使用 find package 命令 在