C++包管理利器CPM

C++包管理利器CPM

一、介绍

CPM.cmake is a cross-platform CMake script that adds dependency management capabilities to CMake. It’s built as a thin wrapper around CMake’s FetchContent module that adds version control, caching, a simple API and more.
CPM.cmake是一个与CMake配合使用的C++包管理工具,更准确说是依赖管理,它主要用于简化C++项目中对第三方依赖引入的复杂性。 通过使用CPM,开发者可以更轻松地将所需的第三方库集成到他们的项目中,而无需手动下载、配置和管理这些库。CPM提供了一个简洁的语法,使开发者能够以声明式的方式指定项目所需的依赖项,并自动处理其下载、构建和安装过程。这样,开发者可以更专注于项目本身的开发,而不必花费过多时间和精力来处理依赖项的繁琐细节。总之,CPM的出现大大简化了C++项目的依赖管理工作,提高了开发效率。
总结:包管理、依赖管理、跨平台、轻量化、即插即用、语法简单

二、CPM语法

CPMAddPackage(
  NAME          # The unique name of the dependency (should be the exported target's name)
  VERSION       # The minimum version of the dependency (optional, defaults to 0)
  OPTIONS       # Configuration options passed to the dependency (optional)
  DOWNLOAD_ONLY # If set, the project is downloaded, but not configured (optional)
  [...]         # Origin parameters forwarded to FetchContent_Declare, see below
)
  • […] 指定第三方依赖的源位置(支持Github, Gitlab, 和指定URL)
  • 提供GIT_REPOSITORY、GIT_REPOSITORY、GIT_TAG 或者直接提供URL

指定URL示例

CPMAddPackage("https://example.com/my-package-1.2.3.zip")

CPMAddPackage("https://example.com/my-package-1.2.3.zip#MD5=68e20f674a48be38d60e129f600faf7d")

CPMAddPackage("https://example.com/my-package.zip@1.2.3")

指定版本用@version, 比如xxx@1.2.1
指定tag用#tag,比如xxx#1.2.1
针对github,可以简写成gh:user/name@1.2.1
针对gitlab, 可以简写成gl:user/name@1.2.1

jsoncpp 引入示例

CPMAddPackage(
    NAME jsoncpp
    GITHUB_REPOSITORY open-source-parsers/jsoncpp
    GIT_TAG 1.9.5
    OPTIONS "JSONCPP_WITH_TESTS OFF"
)

# 简化
CPMAddPackage("gh:open-source-parsers/jsoncpp#1.9.5")

特别说明

在调用CPMAddPackage之后,将在本地作用域中定义以下变量,其中<dependency>是依赖项的名称。
<dependency>_SOURCE_DIR:依赖性源码路径
<dependency>_BINARY_DIR :依赖项编译路径
<dependency>_ADDED : 依赖项是否被添加:YES(之前没有被添加过),NO(反之)
比如:

jsoncpp_SOURCE_DIR
jsoncpp_BINARY_DIR
jsoncpp_ADDED

三、工程引入

1、CPM.cmake引入

手动下载引入

直接下载CPM.cmake脚本(假定下载到/your_project_path/cmake/CPM.cmake),然后在CMakeLists.txt中include即可。

# CMakeLists.txt

include(your_project_path/cmake/CPM.cmake)
自动下载引入

直接在CMakeLists.txt中使用 file 指令自动下载,然后include。

# CMakeLists.txt

# download CPM.cmake
file(
  DOWNLOAD
  https://github.com/cpm-cmake/CPM.cmake/releases/download/v0.38.7/CPM.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake
)
include(${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake)

2、 测试代码

工程目录
.
├── CMakeLists.txt
└── main.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)

project(jsontest)

# download CPM.cmake
file(
  DOWNLOAD
  https://github.com/cpm-cmake/CPM.cmake/releases/download/v0.38.7/CPM.cmake
  ${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake
)
include(${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake)

# ---- Dependencies ----
CPMAddPackage("gh:nlohmann/json@3.11.3")
CPMAddPackage(
    NAME jsoncpp
    GITHUB_REPOSITORY open-source-parsers/jsoncpp
    GIT_TAG 1.9.5
    OPTIONS "JSONCPP_WITH_TESTS OFF"
)
# CPMAddPackage("gh:open-source-parsers/jsoncpp#1.9.5")
# ---- Executable ----

add_executable(jsontest main.cpp)
target_link_libraries(jsontest nlohmann_json jsoncpp_lib)
main.cpp
#include <iostream>
#include <nlohmann/json.hpp>
#include <json/json.h>

int main() {
    auto j = nlohmann::json::parse(R"({"happy": true, "pi": 3.141})");
    std::cout << "test nlohman_json: " << j.dump(2) << std::endl;

    Json::Value root;
    root["action"] = "run";
    root["number"] = 1;
    Json::FastWriter writer;
    std::cout << "test jsoncpp: " << writer.write(root) << std::endl;

    return 0;
}
cmake构建
cmake -B build
cmake --build build

在这里插入图片描述

运行

./build/bin/jsontest

test nlohman_json: {
  "happy": true,
  "pi": 3.141
}
test jsoncpp: {"action":"run","number":1}

四、参考

1. CPM: https://github.com/cpm-cmake/CPM.cmake
2. CPM: An Awesome Dependency Manager for C++ with CMake: https://medium.com/swlh/cpm-an-awesome-dependency-manager-for-c-with-cmake-3c53f4376766
3. FetchContent: https://cmake.org/cmake/help/latest/module/FetchContent.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/232669.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四:爬虫-Cookie与Session实战

四&#xff1a;Cookie与Session实战 ​ 在浏览网站的过程中&#xff0c;我们经常会遇到需要登录的情况&#xff0c;有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站&#xff0c;但是有时候过一段时间就需要重新登录。还有一些网站&#xff0c;在打开浏览器…

Uniapp软件库全新带勋章功能(包含前后端源码)

源码介绍&#xff1a; Uniapp开发的软件库全新带勋章功能&#xff0c;搭建好后台 在前端找到 util 这个文件 把两个js文件上面的填上自己的域名&#xff0c;电脑需要下载&#xff1a;HBuilderX 登录账号 没有账号就注册账号&#xff0c; 然后上传文件&#xff0c;打包选择 “…

轻量封装WebGPU渲染系统示例<43>- 材质组装流水线(MaterialPipeline)之灯光和阴影(源码)

目标: 数据化&#xff0c;模块化&#xff0c;自动化 备注: 从这个节点开始整体设计往系统规范的方向靠拢。之前的都算作是若干准备。所以会和之前的版本实现有些差异。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sa…

spring cloud 修改bootstrap文件的文件名

前言 spring boot 2.1.2.RELEASE spring cloud 默认的启动文件 spring cloud 默认的启动文件为 bootstrap.yml 修改bootstrap文件的文件名 添加参数 --spring.config.locationclasspath:bootstrap.yml或者 --spring.cloud.bootstrap.locationclasspath:bootstrap.yml还可…

TrustZone​之在安全状态之间切换

如果处理器处于NS.EL1,而软件想要转移到S.EL1,应该如何实现呢? 要改变安全状态,无论是向上还是向下,执行都必须经过EL3,如下图所示: 前面的图表显示了在不同安全状态之间移动涉及的步骤的示例序列。逐步进行解释: 进入较高的异常级别需要一个异常。通常,此异常…

【ScienceAI Weekly】IBM新AI芯片提效25倍;清华大学发AI辅助框架;DeepMind新工具预测220万新晶体

「ScienceAI Weekly」是 HyperAI 超神经新创建的半月更栏目&#xff0c;主要从科研成果、企业动态、工具资源、近期活动 4 个维度&#xff0c;收集呈现 ScienceAI 领域近期值得关注的最新动态&#xff0c;以期为长期关注该领域的从业者、爱好者&#xff0c;提供更有价值的圈内资…

springboot+jdbcTemplate+sqlite编程示例——以沪深300成分股数据处理为例

引言 我们在自己做一些小的项目或者小的数据处理分析的时候&#xff0c;很多时候是不需要用到mysql这样的大型数据库&#xff0c;并且也不需要用到maven这样很重的框架的&#xff0c;取而代之可以使用jdbcTemplatesqlite这样的组合。 本文就介绍一下使用springbootjdbcTempla…

千锋 Vue 详细笔记整理

视频笔记是根据B站 千锋 涛哥 - SpringBootvue前后端分离项目《锋迷商城》实战课-完结版 进行整理的 笔记可上 gitee仓库 自取 千锋 Vue 笔记整理 一、vue 的简介1.1 使用 JQuery 的复杂性问题1.2 VUE 简介1.2.1 前端框架1.2.2 MVVM 二、 vue 入门使用2.1 vue 的引入2.2 入门案…

[LeetCode周赛复盘] 第 119 场双周赛20231209

[LeetCode周赛复盘] 第 119 场双周赛20231209 一、本周周赛总结100130. 找到两个数组中的公共元素1. 题目描述2. 思路分析3. 代码实现 100152. 消除相邻近似相等字符1. 题目描述2. 思路分析3. 代码实现 100147. 最多 K 个重复元素的最长子数组1. 题目描述2. 思路分析3. 代码实…

4.8 构建onnx结构模型-Less

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Less 结点进行分析 方式 方法一&a…

Redis有序集合对象

一.编码 有序集合的编码可以是ziplist或者skiplist。 ziplist编码的有序集合对象使用压缩列表作为底层实现&#xff0c;每一个集合元素使用紧挨在一起的两个压缩列表节点来保存。第一个节点保存元素的成员(member)&#xff0c;而第二个元素则保存元素的分值(score)。 127.0.0.…

Javaweb之 依赖管理的详细解析

04. 依赖管理 4.1 依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖&#xff1a; 例如&#xff1a;在当前工程中&#xff0c;我们需要用到logback来记录日志&#xff0c;此时就可以在maven工程的pom.xml文件中&#xff0c;引入logback的依…

无参RCE [GXYCTF2019]禁止套娃1

打开题目 毫无思绪&#xff0c;先用御剑扫描一下 只能扫出index.php 我们尝试能不能用php伪协议读取flag php://filter/readconvert.base64-encode/resourceindex.php php://filter/readconvert.base64-encode/resourceflag.php 但是页面都回显了429 怀疑是不是源码泄露 用…

【GDB】

GDB 1. GDB调试器1.1 前言1.2 GDB编译程序1.3 启动GDB1.4 载入被调试程序1.5 查看源码1.6 运行程序1.7 断点设置1.7.1 通过行号设置断点1.7.2 通过函数名设置断点1.7.3 通过条件设置断点1.7.4 查看断点信息1.7.5 删除断点 1.8 单步调试1.9 2. GDB调试core文件2.1 设定core文件的…

Qt之QSlider和QProgressBar

Qt之QSlider和QProgressBar 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);connect(ui->dial,&QDial::valueChanged,this,&Widget::do_val…

【Oracle】backup备份时报错ORA-19809,ORA-9804

Oracle备份数据库时报错 ORA-19809: limit exceeded for recovery files ORA-19804: cannot reclaim 10305536 bytes disk space from 4385144832 limit 1.清理过时的备份&#xff1a; 使用RMAN删除不再需要的过时备份&#xff0c;以释放空间。执行以下命令&#xff1a; DEL…

win系统一台电脑安装两个不同版本的mysql教程

文章目录 1.mysql下载zip包&#xff08;地址&#xff09;2.解压在你的电脑上&#xff08;不要再C盘和带中文的路径&#xff09;3.创建my.ini文件4.更改环境变量&#xff08;方便使用, 可选&#xff09;5.打包mysql服务6.初始化mysql的data7.启动刚刚打包的服务8.更改密码 1.mys…

普冉(PUYA)单片机开发笔记(8): ADC-DMA多路采样

概述 上一个实验完成了基于轮询的多路 ADC 采样&#xff0c;现在尝试跑一下使用 DMA 的 ADC 多路采样。厂家例程中有使用 DMA 完成单路采样的&#xff0c;根据这个例程提供的模板&#xff0c;再加上在 STM32 开发同样功能的基础&#xff0c;摸索着尝试。 经过多次修改和测试&…

《安富莱嵌入式周报》第328期:自主微型机器人,火星探测器发射前失误故障分析,微软推出12周24期免费AI课程,炫酷3D LED点阵设计,MDK5.39发布

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; 【实战技能】 单步运行源码分析&#xff0c;一期视频整明白FreeRTOS内核源码框架和运行…

解释Spring中一个bean的注入过程

目录 1、定义Bean&#xff1a; XML配置方式&#xff1a; 2、注入方式&#xff1a; 构造器注入&#xff08;Constructor Injection&#xff09;&#xff1a; Setter方法注入&#xff08;Setter Injection&#xff09;&#xff1a; 字段注入&#xff08;Field Injection&…
最新文章