C++包管理利器CPM

news2024/11/25 14:21:34

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.coloradmin.cn/o/1287656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 安全的《加/解密处理》的实战--案例(二)

前言: 在Web开发中&#xff0c;安全性一直是一个重要而复杂的议题&#xff0c;尤其是与敏感数据操作有关时。数据传输地过程中需要保证信息绝对的安全性&#xff0c;包括了诸如用户名、密码、个人信息等&#xff0c;这就需要对这类信息进行加密与解密。本案例&#xff08;二&a…

【LeetCode热题100】【双指针】接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

一. 初识数据结构和算法

数据结构与算法是一个达到高级程序员的敲门砖。当你脱离了语言的应用层面&#xff0c;去思考他的设计层面时&#xff0c;你就依旧已经开始初识数据结构与算法了 数据结构 什么是数据结构 对于数据结构的定义官方并没有统一的解释&#xff0c;在各个百科以及算法的书中&#xf…

《课程教育研究》期刊投稿简介

《课程教育研究》杂志系内蒙古自治区文化和旅游厅主管&#xff0c;内蒙古自治区北方文化研究院主办&#xff0c;面向国内公开发行的教育类学术期刊。国际标准刊号&#xff1a;ISSN2095-3089&#xff0c;国内统一刊号CN15-1362/G4&#xff0c;月刊。 国家新闻出版总署批准的正规…

使用cross-env兼容windows和linux环境的nodejs变量

文章目录 前言一、windows使用二、linux环境三、区别相同点不同点 四、使用cross-env兼容项目安装cross-env使用 总结如有启发&#xff0c;可点赞收藏哟~ 前言 由于办公和家里的开发环境不同&#xff08;windows和linux&#xff09; 在处理nodejs项目的时候&#xff0c;脚本设…

使用 Go Modules 管理依赖:简明教程

一、GoLang 中包的介绍和定义 包&#xff08;package&#xff09;是多个 Go 源码的集合&#xff0c;是一种高级的代码复用方案Go 语言为我们提供了很多内置包&#xff0c;如 fmt、strconv、strings、sort、errors、times、encoding/json、os、io 等Golang 中的包可以分为三种&…

去掉参数中第一个“,”

记录一下&#xff0c;前端传参中&#xff0c;传给我参数是“categoryIds: ,1731557494586241026,1731569816263311362,1731569855534579713,1731858335179223042,1731858366821052418” 但是后端&#xff0c;因为我的mybati是in查询&#xff0c;所以因为第一个是“,”。所以会导…

搭建React项目,基于Vite+React+TS+ESLint+Prettier+Husky+Commitlint

基于ViteReactTSESLintPrettierHuskyCommitlint搭建React项目 node: 20.10.0 一、创建项目 安装包管理器pnpm npm i pnpm -g基于Vite创建项目 pnpm create vitelatest web-gis-react --template react-ts进入项目目录安装依赖 $ cd web-gis-react $ pnpm i启动项目 $ pnpm…

WeakMap

WeakMap简介 作为es6一种新的数据结构&#xff0c;他是一种键值对的集合。与Map最大的区别有两个 1. 是其中的键必须是对象或非全局注册的符号。 全局注册的符号 const s1 Symbol.for(mySymbol) 非全局注册的符号 const s1 Symbol(mySymbol)了解Symbol.for 2. 不会创建对它…

C++12.5

想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&#xff0c;他会为每种动物表演做简单的介绍。 在这个场景中&#xff0c;我们可以将动物比作是不同的类&#xff0c;而每种动物表演则…

我在USC南加大学游戏:真实经历/录取作品集_RoSSo艺术留学

近日&#xff0c;美国Common App最新早申统计数据&#xff1a;早申人数与疫情前相比增加了41%&#xff01;专注于国际艺术教育的RoSSo也发现&#xff0c;2022-2023申请季提交早申的学生中&#xff0c;各类热门院校以及艺术留学专业申请人数均是“涨”声一片&#xff01; 图源官…

mvc模式test2

关于上篇book.java中使用类型不一样导致的报错 是在bookdao.java中解决 bookservlet.java package servlet; import java.io.IOException; import beans.Book; import dao.BookDao; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servl…

[跑代码-遇到问题-报错3]BK-SDM. KeyError: ‘up_blocks.0‘

File "src/kd_train_text_to_image.py", line 790, in mainKeyError: up_blocks.0 出问题的原因 dict acts_tea读到dict acts_stu没有读到dict 原因是 unet_teacher的结构后面直接接down_blocks&#xff08;正常&#xff09;unet_teacher.down_blocks 但是unet的结构…

神经网络模型流程与卷积神经网络实现

神经网络模型流程 神经网络模型的搭建流程&#xff0c;整理下自己的思路&#xff0c;这个过程不会细分出来&#xff0c;而是主流程。 在这里我主要是把整个流程分为两个主流程&#xff0c;即预训练与推理。预训练过程主要是生成超参数文件与搭设神经网络结构&#xff1b;而推理…

Vue3 pinia的基本使用

pinia的使用跟vuex很像&#xff0c;去除了很多没用的api&#xff0c;写法有两种&#xff0c;一种老式的选项式api还有一种组合式api&#xff0c;用哪种根据自己喜好来&#xff0c;以下示例为组合式api 更多教程参考官网&#xff1a;pinia官网https://pinia.vuejs.org/zh/ 安装…

无线网优AP、SW发现控制器

目录 无线网优解决的问题 1、信号覆盖不足的原因 2、信道繁忙 3、非802.11干扰 4、协商速率低 5、漫游效果差 6、有线带宽阻塞 无线网优方法 交换机发现与激活 一&#xff0c;交换机发现控制器方式 1、二层广播 2、DHCP option43方式 3、DNS域名解析方式 4、trou…

创建vue3数学符号选择器(vue3+elementPlus+ts)

本文包含两种效果&#xff1a; 效果一&#xff1a;数学符号只能选择一次&#xff0c;选中的数学符号高亮 效果二&#xff1a;相同的数学符号可以选择多次&#xff0c;当前选中的数学符号高亮 首先创建math.ts定义常见数学符号数组 : export const symbols [{ id: 1, value: …

Flutter桌面应用程序定义系统托盘Tray

文章目录 概念实现方案1. tray_manager依赖库支持平台实现步骤 2. system_tray依赖库支持平台实现步骤 3. 两种方案对比4. 注意事项5. 话题拓展 概念 系统托盘&#xff1a;系统托盘是一种用户界面元素&#xff0c;通常出现在操作系统的任务栏或桌面顶部。它是一个水平的狭长区…

物联网水表和4G水表的区别有哪些?

随着科技的发展&#xff0c;水表也不再是传统的机械表&#xff0c;而是经过数字化和智能化改造的物联网水表和4G水表。这两种水表具有很多的不同点。那么&#xff0c;物联网水表和4G水表的区别有哪些&#xff1f; 首先&#xff0c;物联网水表和4G水表的通信方式不同。物联网水表…

指针进阶知识超详细讲解(C语言)(中)

前言 苦苦等待&#xff0c;终于迎来了我们的指针讲解第二期&#xff0c;如果有还没有看过上一期的小伙伴&#xff0c;那赶紧点击这个链接学习后再来看这篇博客吧。链接&#xff1a;指针基础知识超详细讲解&#xff08;C 语言&#xff09;&#xff08;上&#xff09; 如果对学习…