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

在CMake中利用vcpkg配置C/C++环境

在CMake中利用vcpkg配置C/C++环境

许多复杂的开源项目常常依赖数个C/C++库,挨个配置依赖库是非常繁琐的劳动。所幸现在我们有了vcpkg,可以帮我们省去很多配置的劳动。

vcpkg是一个跨平台的C/C++库配置工具。它可以方便地下载、编译、管理大多数的开源库。
其使用方式在微软文档中有详细说明。

在CMake中启用vcpkg工具链

我们将vcpkg的路径为$VCPKG_ROOT,那么工具链文件vcpkg.cmake的全路径是$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake

例如,在我的计算机上vcpkg放在E盘,那么工具链文件的路径是E:/vcpkg/scripts/buildsystems/vcpkg.cmake

一般而言,使用命令行配置工具链更方便;但也可以使用图形界面配置;还可以直接在CMakeLists.txt文件中指定变量CMAKE_TOOLCHAIN_FILE。下面分别介绍这三种配置方式。

命令行配置

相比常规的CMake命令,添加选项-DCMAKE_TOOLCHAIN_FILE=以启用工具链:

cmake .. -DCMAKE_TOOLCHAIN_FILE=E:/vcpkg/scripts/buildsystems/vcpkg.cmake

需要注意,CMake的命令行选项中的等号两侧不能有空格。即

cmake .. -DCMAKE_TOOLCHAIN_FILE = E:/vcpkg/scripts/buildsystems/vcpkg.cmake

这样的写法是错误的。会产生报错:

CMake Error: Parse error in command line argument: CMAKE_TOOLCHAIN_FILE
Should be: VAR:type=value
CMake Error: Run ‘cmake --help’ for all supported options.

图形界面配置

有的开发者喜欢使用cmake-gui.exe来配置项目,其界面如下图所示。

在这里插入图片描述
点击“Configure”,弹出如下对话框:

在这里插入图片描述

选择“Specify toolchain file for cross-compiling”,点击Next,然后选择vcpkg.cmake的路径,如下图所示:
在这里插入图片描述
然后,点击“Finish”,完成工具链的设置,开始配置。

在CMakeLists.txt中配置

在CMakeLists.txt中的project()之前添加下面的语句:

set(CMAKE_TOOLCHAIN_FILE E:/vcpkg/scripts/buildsystems/vcpkg.cmake)

如果系统中设置了VCPKG_ROOT环境变量,则可以改成直接使用$ENV{VCPKG_ROOT},以便在不同计算机上通用:

set(CMAKE_TOOLCHAIN_FILE $ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)

这种方式等价于上面两种配置方式。

完整配置项

在vcpkg官方的教程中,推荐用户使用两个文件CMakePresets.jsonCMakeUserPresets.json。将这两个文件放在CMakeLists.txt同级目录中,然后利用--preset=选项运行cmake .. --preset=default即可。它们的内容如下:

CMakePresets.json

{"version": 3,"configurePresets": [{"name": "vcpkg","binaryDir": "${sourceDir}/build","cacheVariables": {"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"}}]
}

CMakeUserPresets.json

{"version": 3,"configurePresets": [{"name": "default","inherits": "vcpkg","environment": {"VCPKG_ROOT": "<path to vcpkg>"}}]
}

扩展阅读

CMake的Presets机制
vcpkg in CMake projects
vcpkg-GitHub
教程:通过 CMake 安装和使用包

相关文章:

  • visual studio code中的插件都是怎么开发的?用的什么编程语言?
  • 谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频
  • 从零开始学习three.js(21):一文详解three.js中的矩阵Matrix和向量Vector
  • MyBatis:动态SQL
  • 中国城市间交通驾车距离矩阵(2024)
  • Oracle 中 open_cursors 参数详解:原理、配置与性能测试
  • Java 后端基础 Maven
  • Linux 移植 Docker 详解
  • uniapp小程序获取手机设备安全距离
  • Grafana之Dashboard(仪表盘)
  • OpenCV CUDA 模块中的矩阵算术运算-----在频域中执行两个复数频谱的逐元素乘法的函数mulSpectrums()
  • 多商户1.8.1版本前端问题优化集合指南
  • 可视化图解算法41:搜索二维矩阵(二维数组中的查找)
  • OpenCV CUDA模块中的矩阵算术运算------创建卷积操作对象的工厂方法 cv::cuda::createConvolution
  • 批量剪辑 + 矩阵分发 + 数字人分身源码搭建全技术解析,支持OEM
  • Linux 判断是否有未挂载的盘 分区挂载 (挂载所有大小的盘,包括挂载超过2T的盘)
  • Qt框架核心组件完全指南:从按钮交互到定时器实现
  • Regmap子系统之六轴传感器驱动-编写icm20607.c驱动
  • 基于STM32的光照测量报警Proteus仿真设计+程序设计+设计报告+讲解视频
  • 供应链风险管理中,企业如何识别关键风险因素?
  • 著名文学评论家、原伊犁师范学院院长吴孝成逝世
  • 海南乐城管理局原局长贾宁已赴省政协工作,曾从河南跨省任职
  • 媒体报道一民企投资400万运营出租车4年未获批,广西隆林县回应
  • 人民日报评论员观察:稳就业,抓好存量、增量、质量
  • 专利申请全球领先!去年我国卫星导航与位置服务产值超5700亿元
  • 广东缉捕1名象牙走私潜逃非洲“红通”逃犯