当前位置: 首页 > news >正文

C++包管理之`vcpkg`简介

文章目录

    • 工程文件
    • 安装`vcpkg`
    • 安装`fmt`库
      • 安装全局的库
      • 安装仅该工程使用的库
    • 在`CMake`中使用`vcpkg`
      • 通过`CMAKE_TOOLCHAIN_FILE`使用`vcpkg`
      • 通过CMakePresets.json使用vcpkg

在C++开发中,我们经常会使用一些第三方库,比如说Boostfmtspdlog等等。这些库的安装和使用一直是一个比较头疼的问题,特别是在Windows平台上。vcpkg就是一个用于管理C++库的工具,它可以帮助我们安装和管理C++库。

本文将通过一个示例来介绍vcpkg的基本使用方法。

工程文件

首先,我们需要一个C++工程。这里我们使用CMake来构建工程。该工程使用到了第三方库libfmt. 我们的工程目录结构如下:

.
├── CMakeLists.txt
├── CMakePresets.json
└── main.cpp

CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.19)
project(vcpkg_demo)find_package(fmt CONFIG REQUIRED)add_executable(vcpkg_demo main.cpp)
target_link_libraries(vcpkg_demo PRIVATE fmt::fmt)

CMakePresets.json内容如下:

{"version": 3,"cmakeMinimumRequired": {"major": 3,"minor": 19,"patch": 0},"configurePresets": [{"name": "default","generator": "Ninja","binaryDir": "${sourceDir}/build","cacheVariables": {"CMAKE_TOOLCHAIN_FILE": "/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake"}}]
}

main.cpp内容如下:

#include <fmt/core.h>
#include <fmt/ranges.h>
#include <vector>int main() {fmt::print("Hello world");std::vector<int> v = {1, 2, 3, 4, 5};fmt::println("v = {}\n", v);return 0;
}

接下来, 我们需要通过vcpkg安装fmt库。

安装vcpkg

首先,我们需要下载vcpkg。可以通过以下命令下载:

git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh # Linux/macOS
# .\bootstrap-vcpkg.bat # Windows

安装fmt

有两种方式, 可以安装全局的库也可以安装仅该工程使用的库.

安装全局的库

然后,我们需要安装fmt库。可以通过以下命令安装:

cd /path/to/vcpkg # 进入vcpkg目录
./vcpkg install fmt

安装仅该工程使用的库

cd vcpkg_demo # 进入工程目录
/path/to/vcpkg/vcpkg new --application
/path/to/vcpkg/vcpkg add port fmt
/path/to/vcpkg/vcpkg install

此时, 会在工程目录下生成一个vcpkg.json文件, 该文件用于记录工程所使用的库.
内如如下:

{"dependencies": ["fmt"]
}

还有一个 vcpkg-configuration.json 文件, 用于记录工程所使用的库的版本信息.
内容如下:

{"default-registry": {"kind": "git","baseline": "cacf5994341f27e9a14a7b8724b0634b138ecb30","repository": "https://github.com/microsoft/vcpkg"},"registries": [{"kind": "artifact","location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip","name": "microsoft"}]
}

该文件随着vcpkg版本的更新可能会有变化.

CMake中使用vcpkg

通过CMAKE_TOOLCHAIN_FILE使用vcpkg

接下来,我们需要配置CMake,让它能够找到vcpkg安装的库。我们可以通过以下命令配置:

cd vcpkg_demo/../ # 在vcpkg_demo的上一级目录
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake -S vcpkg_demo -B build-vcpkg-demo
cmake --build build-vcpkg-demo

通过CMakePresets.json使用vcpkg

CMake Presets 是CMake 3.19版本引入的新特性,它可以帮助我们简化CMake的配置。

cd vcpkg_demo
cmake --preset default
cmake --build build/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何限制 docker 使用cpu
  • HTML中a标签跳转后路径不正确?
  • IDEA 本地有jar包依赖文件,但是所有引用的jar包全部爆红
  • 【ROS 最简单教程 002/300】ROS 集成开发环境安装 (虚拟机版): Noetic
  • GLSL教程 第10章:高级渲染技术
  • QEMU 新增QMPHMP指令【原文阅读】
  • keil 启动在线调试后不能单步执行问题解决,卡在汇编代码
  • pyinstaller带浏览器一起打包playwright 独立运行exe
  • react子组件向父组件传参
  • R语言 爬取数据+简单清洗
  • 【前端学习笔记】CSS基础一
  • 2023河南萌新联赛第(二)场 南阳理工学院
  • 在MySQL中处理同时进行的SELECT和UPDATE操作20240729
  • TCP/IP 网络模型详解(二)之输入网址到网页显示的过程
  • 嵌入式初学-C语言-八
  • [iOS]Core Data浅析一 -- 启用Core Data
  • eclipse的离线汉化
  • HTML中设置input等文本框为不可操作
  • IDEA 插件开发入门教程
  • JS题目及答案整理
  • LeetCode算法系列_0891_子序列宽度之和
  • Median of Two Sorted Arrays
  • Mithril.js 入门介绍
  • mysql 数据库四种事务隔离级别
  • PhantomJS 安装
  • Python中eval与exec的使用及区别
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于webpack 的 vue 多页架构
  • 山寨一个 Promise
  • 设计模式走一遍---观察者模式
  • 实习面试笔记
  • 实现菜单下拉伸展折叠效果demo
  • 以太坊客户端Geth命令参数详解
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Java总结 - String - 这篇请使劲喷我
  • ​水经微图Web1.5.0版即将上线
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (C#)获取字符编码的类
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (poj1.3.2)1791(构造法模拟)
  • (二)Linux——Linux常用指令
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转载)从 Java 代码到 Java 堆
  • .gitignore不生效的解决方案
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .Net core 6.0 升8.0
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net(C#)中String.Format如何使用
  • .Net的DataSet直接与SQL2005交互