在Visual Studio/Qt Creator 中使用CMake安装和使用vcpkg包

文章目录

    • 0. vcpkg简介和安装
      • 0.1 vcpkg简介
      • 0.2 vcpkg安装
        • 0.2.1 如何在Visual Studio 2022以及以上版本中安装vcpkg
        • 0.2.2 在其他VS版本或Qt Creator等平台上中安装vcpkg
    • 1. 在Visual Studio 中使用CMake安装和使用vcpkg包
      • 1.1 创建Visual Studio项目
      • 1.2 设置项目文件
        • a. 配置`CMakePresets.json`文件:
        • b. 编辑`CMakeList.txt`文件
        • c. 修改`HelloWorldVS.cpp`文件
      • 1.3 生成并运行该项目
    • 2. 在Qt Creator中使用CMake安装和使用vcpkg包
      • 2.1 启用vcpkg插件及设置
      • 2.2 创建Qt项目
      • 2.3 编辑vcpkg清单文件
    • 3. 碰到的一些问题
    • 附 参考文献

0. vcpkg简介和安装

0.1 vcpkg简介

vcpkg 是 Microsoft 和 C++ 社区维护的免费开放源代码 C/C++ 包管理器。 它于 2016 年推出,可帮助开发人员将项目迁移到较新版本的 Visual Studio。 vcpkg 已演变成 Windows、macOS 和 Linux 上开发人员使用的跨平台工具。 vcpkg 拥有大量开放源代码库注册表和企业就绪功能,旨在通过支持任何构建和项目系统来促进开发过程。 vcpkg 是核心的 C++ 工具,使用 CMake 中的脚本以 C++ 语言编写。 它从头开始设计,以解决 C/C++ 开发人员体验的独特难点。

0.2 vcpkg安装

0.2.1 如何在Visual Studio 2022以及以上版本中安装vcpkg

从 Visual Studio 2022 开始,vcpkg 已经被包含在 Visual Studio Installer 中,你可以直接在安装或修改 Visual Studio 时选择安装 vcpkg。具体步骤如下:

  1. 打开 Visual Studio 安装器,选择安装或修改 Visual Studio 2022。
  2. 在安装页面中,选择你需要的工具选项,例如“C++桌面开发”。
  3. 在组件页面中,勾选 “vcpkg - C++库管理器”。
  4. 点击修改或安装,等待安装完成。
  5. 安装完成后,你就可以使用 vcpkg 了。
    在这里插入图片描述
0.2.2 在其他VS版本或Qt Creator等平台上中安装vcpkg
  1. 从github上克隆存储库
    创建文件夹如C:\dev,将vcpkg从github中克隆到当前文件夹中
git clone https://github.com/microsoft/vcpkg.git
  1. 运行启动脚本
    启动脚本执行先决条件检查并下载 vcpkg 可执行文件。
cn vcpkg && bootstrap-vcpkg.bat

运行成功,会给出如下提示
在这里插入图片描述

  1. 设置环境变量
    打开环境变量设置窗口:我的电脑【右键】-> 属性 -> 高级系统设置 -> 环境变量,选择Path,点击“编辑”,将C:\dev\vcpkg添加后确定。

1. 在Visual Studio 中使用CMake安装和使用vcpkg包

1.1 创建Visual Studio项目

  1. 使用“CMake项目”模版创建项目
    在这里插入图片描述
  2. 项目命名为HelloWorldVS,并选中“将解决方案和项目放在同一目录中”的复选框,点击“创建”
    在这里插入图片描述
  3. 生成清单文件并添加依赖项
  • 打开VS中的【开发人员命令提示】
    在这里插入图片描述
  • 运行以下命令来创建vcpkg清单文件(vcpkg.json)
vcpkg new --application

运行成功后,可以看到项目目录中多了一个vcpkg.json文件和一个vcpkg-configuration.json文件
在这里插入图片描述

  • 添加fmt包作为依赖项:
vcpkg add port fmt

运行成功后,可在vcpkg.json文件中看到:

{"dependencies": ["fmt"]
}

1.2 设置项目文件

a. 配置CMakePresets.json文件:
  • CMakePresets.json文件重命名为CMakeUserPresets.json
  • 如下所示更新其内容,将 <VCPKG_ROOT> 替换为至 vcpkg 目录的路径。
{"version": 2,"configurePresets": [{"name": "default","generator": "Ninja","binaryDir": "${sourceDir}/build","cacheVariables": {"CMAKE_TOOLCHAIN_FILE": "<VCPKG_ROOT>/scripts/buildsystems/vcpkg.cmake"}}]
}
b. 编辑CMakeList.txt文件

在vs自动创建项目时自动生成的CMakeList.txt中添加一下两行代码,并重新"生成CMake缓存"

find_package(fmt CONFIG REQUIRED)
target_link_libraries(HelloWorldVS PRIVATE fmt::fmt)

在这里插入图片描述

c. 修改HelloWorldVS.cpp文件
#include "HelloWorldVS.h"
#include <fmt/core.h>using namespace std;
int main()
{cout << "Hello CMake." << endl;fmt::print("Hello World.");return 0;
}

1.3 生成并运行该项目

a. 生成项目
按下 Ctrl+Shift+B 以在 Visual Studio 中生成项目。
b. 运行应用程序
选择并运行可执行文件
在这里插入图片描述

可以看到输出:

在这里插入图片描述
示例代码下载:HelloWorldVS.zip

2. 在Qt Creator中使用CMake安装和使用vcpkg包

2.1 启用vcpkg插件及设置

  1. 启用vcpkg插件
    在这里插入图片描述
  2. 设置vcpkg参数
  • 选择“工具”->“Preferences ”,打开设置界面,选择CMake,
    在这里插入图片描述
  • 设置vcpkg路径(如C:\dev\vcpkg
    在这里插入图片描述

2.2 创建Qt项目

  1. 按照QtCreator引导创建新的项目HelloWorldQt,在‘构建系统’页面选择Build system为CMake
    在这里插入图片描述
  2. 创建清单文件(vcpkg.json)
    a. 文件-> New File -> vcpkg -> vcpkg.json Manifest File -> 选择…
    在这里插入图片描述

b. 在弹出的Location对话框中,可以输入文件名(默认为vcpkg.json)和路径(默认为当前项目路径);可以编辑清单内容(默认添加了fmt库)
c. 完成后,项目中会自动生成一个vcpkg.json文件,同时并将该文件添加到了CMakeList.txt中
在这里插入图片描述

2.3 编辑vcpkg清单文件

  1. 添加vcpkg包,如fmt
    在这里插入图片描述
  2. 生成CMake配置文件代码
    在这里插入图片描述
    将以上复制的内容,添加到CMakeList.txt文件中,注意需要将target_link_libraries中的目标改为当前项目的可执行文件名(如main改为HelloWorld
    在这里插入图片描述
  3. 配置vcpkg的路径
    a. 项目->Initial Configuration->添加 string
    秘钥:CMAKE_TOOLCHAIN_FILE
    值:vcpkg的安装路径下的vcpkg.cmake的完整路径,注意路径是斜线/
    b. 点击Re-configure with Initial Parameters
    在这里插入图片描述
  4. 修改main.cpp,并构建运行
    在这里插入图片描述

示例代码下载:HelloWorldQT

3. 碰到的一些问题

  1. 报错: could not find a package configuration file provided by "fmt" with any of ...
    在这里插入图片描述
    解决方法:
    a. 检查CMAKE_TOOLCHAIN_FILE变量值路径是否设置正确;
    b. 如设置正确,若在vs中重新生成一下cmake的缓存,若在qt Creator中则点击Re-configure with Initial Parameters重新生成一下cmake的配置;

  2. 报错:The plain signature for target_link_libraries has already been used with ...
    在这里插入图片描述
    解决方法:
    在使用target_link_libraries过程中,要么为所有元素指定PUBLIC// PRIVATE,要么不指定。
    在本例中,我们只需要删除target_link_libraries中的PRIVATE,再来执行CMake即可。
    在这里插入图片描述

附 参考文献

  1. vcpkg 概述 https://learn.microsoft.com/zh-cn/vcpkg/get_started/overview
  2. 在 Visual Studio 中使用 CMake 安装和使用包https://learn.microsoft.com/zh-cn/vcpkg/get_started/get-started-vs?pivots=shell-cmd
  3. vcpkg Package Managerhttps://doc.qt.io/qtcreator/creator-vcpkg.html
  4. Create vcpkg manifest fileshttps://doc.qt.io/qtcreator/creator-how-to-create-vcpkg-manifest-files.html
  5. Edit vcpkg manifest fileshttps://doc.qt.io/qtcreator/creator-how-to-edit-vcpkg-manifest-files.html

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FLUX.1 实测,堪比 Midjourney 的开源 AI 绘画模型,无需本地显卡,带你免费实战

要列举 AI 绘画开源界的几个关键贡献&#xff0c;一定少不了 Stable Diffusion。 还记否前不久刚推出的 Stable Diffusion 3&#xff1f; 其背后的团队 Stability AI&#xff0c;真的是一波三折&#xff0c;其核心成员出走&#xff0c;成立了一个新公司&#xff1a;Black For…

【Hot100】LeetCode—41. 缺失的第一个正数

原题链接&#xff1a;41. 缺失的第一个正数 1- 思路 手动实现哈希的方式 1- 遍历数组&#xff1a;如果当前的元素落在了 [1,N] 区间内&#xff0c;则 i 元素 赋值在 i-1 的位置上 比如对于数字 1 落在 数组 [0] 的位置 2- 判断条件 利用 while 加条件 ①当前元素落在了 [1,N]…

LVS(Linux virual server)

一&#xff1a;环境准备&#xff1a; rhel9 软件&#xff1a;httpd&#xff0c; ipvsadm 四台纯净的rhel9机子&#xff1a;一台LVS调度设备&#xff08;双网卡&#xff09;&#xff0c;两台webserver&#xff08;单网卡仅主机&#xff09;&#xff0c;一台客户机 DR模式多…

夏天猫毛满天飞?别怕一篇文章教你空气净化器怎么选

家里猫实在太多&#xff0c;3只短毛加上2只长毛&#xff0c;简直就是行走的蒲公英。夏天一到&#xff0c;猫咪的毛发便开始肆意飞舞&#xff0c;这对爱猫人士来说无疑是个烦恼。自从养猫以后&#xff0c;已经养成了每天都打扫卫生的习惯&#xff0c;吸尘器、扫地机必不可少&…

四种推荐算法——Embedding+MLP、WideDeep、DeepFM、NeuralCF

一、EmbeddingMLP模型 EmbeddingMLP 主要是由 Embedding 部分和 MLP 部分这两部分组成&#xff0c;使用 Embedding 层是为了将类别型特征转换成 Embedding 向量&#xff0c;MLP 部分是通过多层神经网络拟合优化目标。——用于广告推荐。 Feature层即输入特征层&#xff0c;是模…

【MySQL】全面剖析索引失效、回表查询与索引下推

1.索引失效的情况 以tb_user表举例&#xff0c;id为主键索引、name和phone字段上建立了一个普通索引&#xff0c;name和phone均为varchar类型。 索引列运算 当在 WHERE 子句或 JOIN 子句中对列使用函数或表达式时&#xff0c;索引会失效。 执行以下语句&#xff0c;可以发现执…

STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led

1、门电路 门电路组成简单加法器&#xff1a; 二进制对电路的影响&#xff1a; 0和1代表无和有&#xff1b; 以下图例&#xff0c;演示与门&#xff1a;左1右1输出1&#xff1b; 电平标准&#xff1a;使用不同的电压表示数字0和1&#xff1b; 高电平&#xff1a;1&#xff1…

AI在医学领域:残差扩散模型预测特发性肺纤维化 (IPF)

关键词&#xff1a; IPF 进展预测、残差扩散模型、临床信息 特发性肺纤维化&#xff08;Idiopathic Pulmonary Fibrosis&#xff0c;IPF&#xff09;是一种严重且不可逆的肺部疾病&#xff0c;它会导致肺部组织出现瘢痕和增厚&#xff0c;从而引起呼吸困难。。及时对IPF进行治…

电子围栏报警系统的创新应用

在科技日新月异的今天&#xff0c;安全防护技术正以前所未有的速度发展&#xff0c;其中&#xff0c;电子围栏报警系统作为智能安防领域的佼佼者&#xff0c;正逐步成为各行各业守护安全的主要选择方案。这一创新技术的应用&#xff0c;不仅极大地提升了安全防护的效率和精准度…

24/8/7 算法笔记 支持向量机回归问题天猫双十一

import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt X np.linspace(0,2*np.pi,50).reshape(-1,1) y np.sin(X) plt.scatter(X,y) 建模 线性核函数 svr SVR(kernel linear) svr.fit(X,y.ravel())#变成一维y_ svr.predict(X) plt.scatter(…

阿里云播放器 web端 问题解决总结

1&#xff1a;ios设备长按视频&#xff0c;会出现系统的放大镜效果&#xff1a; 可以只监听touchstart事件即可 var playerContainer document.getElementById(this.playerId); playerContainer.addEventListener(touchstart, preventZoom, { passive: false }); playerConta…

unity 创建项目报错feature has expired (H0041),sentinel key not found (H0007)

两个报错同一种处理方式。 1、删除以下路径所有文件&#xff1a;C:\ProgramData\SafeNet Sentinel&#xff08;注意&#xff1a;ProgramData为隐藏文件&#xff09; 2、打开Cmd&#xff08;WinR键&#xff0c;输入cmd回车&#xff09;&#xff0c;进入Unity安装所在盘符&#…

为啥https比http慢

Https有ssl的握手 HTTP没有 HTTPS TCP 和HTTP 的TCP 时间差不是很大 HTTPS请求中,ssl所占的时间比例是请求时间总和93.37%, HTTPS请求中,ssl的请求会是tcp请求的14倍,而HTTP中没有这个问题 建议:对安全要求不是很高的,不要使用https请求 图例

自定义DIY线上预约小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 随着移动互联网的快速发展&#xff0c;人们越来越习惯于通过手机进行各种活动的预约。传统的预约方式往往存在着信息不透明、沟通不畅、效率低下等问题&#xff0c;无法满足用户日益增长的需求。同时&#xff0c;对于企业和商家来说&#xff0c;建立一个专属的线上预…

Isaac Lab 安装 (ubuntu22.04环境)

Windows下的安装见这篇博客&#xff1a; Isaac Lab 安装与初体验 &#xff08;windows环境&#xff09;-CSDN博客 ubuntu22.04下的安装与windows下十分类似&#xff0c;还是参考官方的&#xff0c;Installation using Isaac Sim Binaries Installation using Isaac Sim Bina…

Linux驱动开发—ioctl命令构成,设备驱动基础使用ioctl详解

文章目录 1.什么是ioctl?示例 2.ioctl 与 write&#xff0c;read 有什么区别&#xff1f;复杂的设备控制多种数据类型和操作简化应用层代码区分数据和控制 3.ioctl命令的构成宏定义的组成部分具体的宏定义举个栗子 4.ioctl命令的分解宏定义举个栗子 5.ioctl 设备使用应用程序构…

【游戏引擎之路】登神长阶(九)——《3D游戏编程大师技巧》:我想成为游戏之神!

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…

数据库篇--八股文学习第十六天| MySQL的执行引擎有哪些?;MySQL为什么使用B+树来作索引;说一下索引失效的场景?

1、MySQL的执行引擎有哪些&#xff1f; 答&#xff1a; MySQL的执行引擎主要负责查询的执行和数据的存储, 其执行引擎主要有MyISAM、InnoDB、Memery 等。 InnoDB引擎提供了对事务ACID的支持&#xff0c;还提供了行级锁和外键的约束&#xff0c;是目前MySQL的默认存储引擎&…

Codeforces Round 963 (Div. 2)

A题&#xff1a;Question Marks 题目&#xff1a; Tim正在做一个由 4n 个问题组成的测试&#xff0c;每个问题都有 4 个选项&#xff1a;“A”、“B”、“C”和“D”。对于每个选项&#xff0c;有 n 个正确答案对应于该选项&#xff0c;这意味着有 n 个问题的答案为“A”。 n…

个人知识库与RAG的技术

构建个人知识库时&#xff0c;采用RAG结合LangChain的方法极为有效。RAG&#xff0c;即检索增强生成技术&#xff0c;是一种前沿的自然语言处理手段&#xff0c;它融合了信息检索的精确匹配与语言模型的高效文本生成&#xff0c;为处理自然语言相关任务提供了一种既灵活又准确的…