Windows的C++开发环境搭建(基于vcpkg+CMake)

2023-05-16

一直以来,笔者都认为在windows中使用cmake开发C++是一件很难搞的事,windows不像linux那样能方便地对各种C++软件包进行管理,直到发现了vcpkg这个包管理器,才终于使我的windows C++开发体验好了起来。

本文使用vcpkg作为包管理器,cmake作为项目的构建工具,在VS2022/VSCode等IDE或编辑器上搭建C++开发环境。

软件环境

  • Windows 10

  • Git

  • Visual Studio 2022 / Visual Studio Code

  • CMake(optional,VS2022自带cmake)

vcpkg配置

下载安装vcpkg

可以将vcpkg下载到任何位置,一般有两种选择,第一种是将vcpkg作为cmake工程的子模块,将其下载到cmake项目下;第二种是将vcpkg下载到其他位置,添加环境变量,作为全局的包管理器。

本文选择第二种方式

首先选择一个位置下载vcpkg,本文选择直接装在C盘下c:/,在该路径打开Git Bash或者Powershell,使用Git克隆

git clone https://github.com/microsoft/vcpkg
./vcpkg/bootstrap-vcpkg.bat

使用以下命令安装所需要的库:

./vcpkg/vcpkg install <package>

vcpkg在Windows中默认安装的是x86版本的库,如果要x64版本的库,则需要添加后缀x64-windows,以安装x64版本的ceres-solver为例,命令如下:

./vcpkg/vcpkg install ceres:x64-windows

然后vcpkg就会下载ceres的源程序,以及ceres的依赖项(如Eigen3、glog、gflags等),然后编译安装,编译时间比较长,安装成功后会返回以下字段,可以在CMakeLists.txt中加入这些代码来添加ceres依赖

ceres provides CMake targets:
    # this is heuristically generated, and may not be correct
    find_package(Ceres CONFIG REQUIRED)
    target_link_libraries(main PRIVATE ceres Ceres::ceres)

安装完成后,相应的头文件、库文件和<package>-config.cmake文件都会被保存在vcpkg/installed/x64-windows文件夹。

其他常用命令:

  • 列出已安装的package

    vcpkg list
    
  • 可移除指定的package

    vcpkg remove <package>
    

添加环境变量

注意:如果将vcpkg作为项目的子模块使用,则不需要添加环境变量

找到此电脑,右键属性,找到高级系统设置->环境变量,在Path变量中添加值C:\vcpkg即可。然后在任意位置打开一个命令行,输入vcpkg version,如果返回vcpkg版本,则表明环境变量设置成功。这时候就可以在任意位置使用vcpkg命令了。

在VS中使用

运行如下命令:

vcpkg integrate install

执行后会返回:

Applied user-wide integration for this vcpkg root.

All MSBuild C++ projects can now #include any installed libraries.
Linking will be handled automatically.
Installing new libraries will make them instantly available.

CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake"

表示在执行完这个命令后,在VS中的非cmake项目可以直接使用#include包含所需要的库的头文件,在链接环节,也会自动的链接到所安装的库。如果是cmake项目的话,还需要添加cmake选项-DCMAKE_TOOLCHAIN_FILE=<vcpkg path>/scripts/buildsystems/vcpkg.cmake,如:

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

如果不在命令行中添加cmake选项,就要CMakeLists.txt中第一个project()前设置cmake工具链

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

在vscode中也可以通过在.vscode/settings.json中添加以下代码来设置:

"cmake.configureArgs": ["-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake"]

CMake工程示例

新建一个文件夹,创建一个空的CMakeLists.txt文件,用vs2022打开该文件夹,vs会自动识别这是个cmake工程,然后进行配置。在vs中创建main.cpp,继续以ceres库为例,在main.cpp中添加以下程序(来源):

#include <iostream>
#include <ceres/ceres.h>
class CostFunc {
public:
    CostFunc() = default;
    template<typename T>
    bool operator()(const T* x, T* residual) const {
        *residual = 0.5 * pow(T(10.0) - *x, 2);
        return true;
    }
};
int main(int argc, char** argv) {
    ceres::Problem problem;
    double x = 9.0;
    ceres::CostFunction* cost_function
        = new ceres::AutoDiffCostFunction<CostFunc, 1, 1>(new CostFunc);
    problem.AddResidualBlock(cost_function, nullptr, &x             
    );
    ceres::Solver::Options options;
    options.linear_solver_type = ceres::DENSE_QR;
    options.minimizer_progress_to_stdout = true;
    ceres::Solver::Summary summary;
    ceres::Solve(options, &problem, &summary);
    std::cout << summary.BriefReport() << std::endl;
    std::cout << "result: " << x << std::endl;
}

CMakeLists.txt中添加以下代码,再次强调CMAKE_TOOLCHAIN_FILE必须在第一个project()之前设置

cmake_minimum_required(VERSION 3.0.4)
set(CMAKE_TOOLCHAIN_FILE C:/vcpkg/scripts/buildsystems/vcpkg.cmake)
project(cmake_test)
# 寻找依赖项
find_package(Ceres CONFIG REQUIRED)
# 添加头文件路径
include_directories(include ${CERES_INCLUDE_DIRS})
# 生成可执行文件
add_executable(main src/main.cpp)
# 添加链接库
target_link_libraries(main ${CERES_LIBRARIES})

保存后,vs会自动更新cmake项目配置,然后启动程序,VS就会对程序进行编译、运行

在这里插入图片描述

运行后结果如下,表明运行成功

在这里插入图片描述

在VSCode中使用

CMakeLists.txt和main.cpp与前文一致,用VSCode打开文件夹,下方配置栏设置如下:

在这里插入图片描述

如果使用的是另外安装的cmake(不是vs2022自带的cmake),则要确保cmake版本在3.21以上,否则会报以下错误:

CMake Error: Could not create named generator Visual Studio 17 2022

这是因为老版本的cmake还不支持Visual Studio 17 2022这个Generator,点击CMake Latest Release地址下载安装最新版cmake即可。参考

附录

vcpkg瘦身:在使用vcpkg一段时间后,会发现它占用了很大的磁盘空间

image-20220617143645838

可以将vcpkg中的packagebuildtreesdownloads这三个文件夹删除,其中package是不同软件包之间用于暂存的内部文件夹,buildtrees是编译软件包时使用的目录,这也是最占空间的文件夹,downloads保存已下载的软件包源代码或者工具。这三个文件夹都可以删除,删除后占用空间会大大减少。

image-20220617144447716

参考

vcpkg总览

CMake—优雅地构建软件项目实践

vcpkg快速使用教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows的C++开发环境搭建(基于vcpkg+CMake) 的相关文章

  • 语音信号处理 | 基于卡尔曼滤波的语音增强算法

    文章目录 1 概述2 卡尔曼滤波原理被估计的信号离散卡尔曼滤波算法参数选择 3 基于卡尔曼滤波的语音增强算法语音模型分析参数确定 4 程序实现语音数据的导入 加噪与分帧卡尔曼滤波器参数初始化卡尔曼滤波过程结果可视化 5 运行结果与结果分析运
  • UDP实时图像传输进阶篇——1080P视频传输

    在UDP实时图像传输一文中 xff0c 介绍了如何使用UDP来实现图像的实时传输 xff0c 并使用C 进行了发送端和接收端的搭建 但是文中的方法是对整张图片进行JPEG压缩 xff0c 并通过UDP一次性地发送到接收端 xff0c 由于一
  • 机器人路径规划之Dijkstra算法

    在机器人路径规划之动态窗口法文中 xff0c 介绍了一种局部路径规划方法 动态窗口法 xff0c 本文将介绍一种全局路径规划方法 Dijkstra算法 狄克斯特拉算法 Dijkstra算法是从一个顶点到其余各顶点的最短路径算法 xff0c
  • 语音信号处理 | 使用短时能量和谱质心特征进行端点检测

    文章目录 概述原理及MATLAB实现基本流程特征提取短时能量谱质心 阈值估计和阈值化处理提取语音片段 MATLAB2020a中的VAD函数参考 概述 在复杂的应用环境下 xff0c 从音频中分割出语音信号和和非语音信号 xff0c 是一个很
  • 语音信号处理 | 傅里叶变换、短时傅里叶变换、小波变换、希尔伯特变换、希尔伯特黄变换

    在信号处理领域 xff0c 存在诸多变换 xff0c 比如标题中的五个变换 本文将对这五个变换进行介绍和比较 在开始之前 xff0c 我们需要先理清什么是平稳信号 xff0c 什么是非平稳信号 我们知道 xff0c 自然界中几乎所有信号都是
  • clang-format格式文件。可以直接复制引用

    Language Cpp BasedOnStyle LLVM AccessModifierOffset 2 AlignAfterOpenBracket Align AlignConsecutiveMacros false AlignCons
  • 多线程之多核线上考试试题瞎解

    匆忙的大三早已结束 xff0c 时隔两月 xff0c 再以此文祭奠我炸掉的多核考试 这次考试真正能写出来的也就两道题 xff0c 以下简单地记录一下 第二题 随机产生2个10 10的浮点数矩阵A和B xff0c 先将矩阵A和B作转置 xff
  • 视觉SLAM | RealsenseD435i相机标定

    在运行VINS MONO VINS Fusion等SLAM方案的时候 xff0c 需要很准确的相机参数 xff0c 否则很容易漂移 本文是RealsenseD435i相机标定过程的记录 xff0c 标定主要有三个步骤 IMU标定相机标定IM
  • 视觉SLAM | 使用RealsenseD435i运行VINS-Fusion

    使用RealsenseD435i运行VINS Fusion VINS Fusion是基于双目的视觉惯导方案 xff0c 不太符合我目前的需求 xff0c 但这是我使用的第一个视觉SLAM方案 xff0c 接下来还是简单记录下 运行环境 硬件
  • 视觉SLAM | 在ROS上运行ORB-SLAM2

    本文直接使用的github上的orb slam 2 ros实现在ROS上运行ORB SLAM2 xff0c 这个ros包能够得到相机的位姿以及稀疏点云 xff0c 而且删掉了对Pangolin的依赖 xff0c 进行可视化时要用RViz 运
  • ROS报错记录及解决方法(不定期更新)

    ROS下载缓慢 如果是在国内安装 xff0c 建议在安装之前先配置国内的镜像源 xff0c 在软件和更新进行更改即可 参考 xff1a Ubuntu18 04下安装ROS 由于没有公钥 xff0c 无法验证下列签名 安装ROS时报错 xff
  • ROS与STM32通信

    ROS与STM32是用串口进行通信的 xff0c 主要有两种方式 xff0c 一是将STM32作为一个节点 xff0c 二是制作一个上位机节点 负责与STM32进行串口通信 xff0e 第一种方式需要专门的硬件 xff0c 所以我选择第二种
  • 使用VScode搭建ROS开发环境

    俗话说 xff02 工欲善其事必先利其器 xff02 xff0c 之前在Ubuntu上运行的ROS项目都是用vim或者gedit编写和修改代码 xff0c 然后在终端编译运行 xff0c 很不方便 xff0c 函数跳转查看都没办法实现 所以
  • TCP实时图像传输

    之前尝试过使用UDP进行图像传输 xff0c 而UDP协议要求包小于64K xff0c 对于较大的图像 xff0c 需要使用分片压缩的方式进行传输 xff0c 操作较复杂 xff0c 同时不能保证图片的每一部分都能够正确传输 详见 xff1
  • STM32部分BUG及解决方法记录(不定期更新)

    1 编译使用CubeMX生成的代码时报错 Error L6218E Undefined symbol HAL PWREx DisableUCPDDeadBattery referred from stm32g4xx hal msp o 解决
  • 语音信号处理 | Python实现端点检测

    由于项目需要 xff0c 我要使用Python对语音进行端点检测 xff0c 在之前的博客使用短时能量和谱质心特征进行端点检测中 xff0c 我使用MATLAB实现了一个语音端点检测算法 xff0c 下面我将使用Python重新实现这个这个
  • 进程,线程,应用程序。概念理解

    简单的说 xff0c 进程 可以承载一组相关的 NET 程序集 xff0c 而 应用程序域 xff08 简称AppDomain xff09 是对该进程的逻辑细分 一个应用程序域进一步被细分成多个 上下文边界 xff0c 这些边界用来分组目的
  • 搭建STM32开发环境

    安装keil 点击这里下载安装最新版的keil 破解 以管理员身份运行keil xff0c 打开File gt License Management 复制CID xff0c 如下 xff1a 运行keygen2032 exe xff0c 修
  • 路径规划 | 图搜索算法:DFS、BFS、GBFS、Dijkstra、A*

    地图数据常常可以用图 Graph 这类数据结构表示 xff0c 那么在图结构中常用的搜索算法也可以应用到路径规划中 本文将从图搜索算法的基本流程入手 xff0c 层层递进地介绍几种图搜索算法 首先是两种针对无权图的基本图搜索算法 xff1a
  • 移动机器人中地图的表示

    在学习算法之前 xff0c 首先要做的是理解数据 xff0c 所以本专栏在开始介绍运动规划算法前 xff0c 首先介绍一下地图的数据形式 地图有很多种表示形式 xff0c 在移动机器人中比较常用的是尺度地图 拓扑地图 语义地图 尺度地图 x

随机推荐

  • 路径规划 | 随机采样算法:PRM、RRT、RRT-Connect、RRT*

    基于图搜索的路径规划算法主要用于低维度空间上的路径规划问题 xff0c 它在这类问题中往往具有较好的完备性 xff0c 但是需要对环境进行完整的建模工作 xff0c 在高维度空间中往往会出现维数灾难 为了解决这些问题 xff0c 本文将介绍
  • ROS多机通信

    配置主从机IP地址 分别使用sudo vi etc hosts在主从机的 etc hosts文件中添加下面的代码 xff0c 其中pi是主机的用户名 xff0c esdc是从机的用户名 ip要相应的进行更改 xff0c 可以使用ifconf
  • 路径规划 | 图搜索算法:JPS

    JPS算法全称为Jump Point Search xff0c 也就是跳点算法 xff0c 可以视为A 算法的一种改进算法 xff0c 它保留了A 算法的主体框架 xff0c 区别在于 xff1a A 算法是将当前节点的所有未访问邻居节点加
  • 路径规划 | 随机采样算法:Informed-RRT*

    在文章路径规划 随机采样算法 xff1a PRM RRT RRT Connect RRT 中 xff0c 介绍了具备渐近最优性的RRT 算法 随着采样点数的增多 xff0c RRT 算法的规划结果会逐渐收敛到最优 但是可以观察到 xff0c
  • Ubuntu20安装ROS noetic

    Ubuntu20对应的ROS版本为ROS noetic xff0c 安装过程如下 xff1a 1 打开Software amp Updates xff0c 勾选main universe restricted multiverse这四项 2
  • 使用VSCode进行远程C++开发

    本文以Windows连接Ubuntu子系统 WSL 为例来介绍VSCode的远程开发流程 首先在VSCode中安装Remote WSL插件 xff0c 重启VSCode xff0c 如下图所示 xff0c 连接WSL 如果是其他远程 xff
  • ROS话题发布和订阅节点的C++&Python实现

    本文将分别使用C 43 43 和Python来实现话题发布者和订阅者 xff0c 首先创建一个功能包 xff0c 命名为topic pub sub xff0c 添加roscpp xff0c rospy等依赖项 C 43 43 实现 创建话题
  • 只要活着,我愿意一辈子都做程序员

    前不久 xff0c 我看过一个有意思的帖子 xff0c 标题是 35岁是程序员的终点 作者列举了35岁的年龄已经不适合继续做程序员的种种原因 xff0c 试图说服在这个年龄段的程序员做出改变 xff0c 初一看 xff0c 我自己也觉得很有
  • 机器人自主导航 | ROS与移动底盘通信

    本实验是实现机器人自主导航的重要步骤 xff0c 对于轮式机器人 xff0c 可以通过在底盘加装轮式里程计的方式来获得机器人的速度数据 xff0c 这些数据可以用来辅助机器人实现自主定位 xff0c 同时机器人还需要将控制指令发送给移动底盘
  • 使用C++调用Python模块(Linux)

    使用Python调用C 43 43 库见 xff1a 我的另一篇博客 工程配置 本文使用的项目构建工具为CMake xff0c 使用FindPython工具在CMake工程中找到Python库 xff0c 注意CMake最低版本为3 12
  • ROS开机自启设置

    使用robot upstart功能包即可实现节点的开机自启 安装功能包 安装robot upstart功能包 xff0c 本文使用的Ubuntu20对应的ROS版本为noetic span class token function sudo
  • 信号处理 | 维纳滤波推导

    首先给出互相关函数定义 xff1a r s x m
  • 信号处理 | AR模型与Levinson-Durbin递推

    模型形式 由高斯白噪声驱动的全极点模型表示如下 xff1a e n
  • 使用Python调用C++库(基于pybind11)

    本文将用C 43 43 编写一个简单的向量运算库 xff0c 然后使用pybind11将其封装为python包 xff0c 再使用python调用 C 43 43 程序使用CMake构建 使用C 43 43 调用Python模块见 xff1
  • FTP实现Ubuntu与Windows文件互传

    FTP实现window与ubuntu文件互传 本文将介绍如何使用FTP实现Ubuntu和Windows间的文件互传 xff0c 基本方法是在Ubuntu主机上安装FTP服务端 xff0c 在其他设备 Windows 上安装FTP客户端 以下
  • KD-Tree详解: 从原理到编程实现

    C 43 43 实现链接 https gitee com ghowoght kd tree 在点云操作中 xff0c 常常需要从大量点云中找到距离输入点最近的点 xff0c 如果使用线性搜索 xff0c 逐个判断与输入点的距离 xff0c
  • FRP + NoMachine远程桌面开发指南

    在FRP内网穿透 远程ssh终端 43 rdp桌面配置 中介绍了如何远程使用FRP 43 RDP进行外网远程桌面访问 xff0c 但是实测很卡 在两台Ubuntu主机上进行了测试 xff0c 云服务器有8M带宽 xff0c 所以对这种远程桌
  • 升级!!!运用select实现一个简单的TCP通信!

    升级 xff01 xff01 xff01 运用select实现一个简单的TCP通信 多路转接模型select模型select模型的操作流程简介 TCP的实现封装一个TCP服务端封装一个select类main程序 多路转接模型 多路转接IO
  • 嵌入式部分BUG与解决方法记录(不定期更新)

    关闭串口缓存 在使用422转USB数据线采集IMU数据时 xff0c 上位机的USB驱动程序会对接收到的数据进行缓存 xff0c 表现在于IMU使用200Hz的频率发送IMU数据 xff0c 而采集到的IMU数据的时间戳间隔并不是5ms x
  • Windows的C++开发环境搭建(基于vcpkg+CMake)

    一直以来 xff0c 笔者都认为在windows中使用cmake开发C 43 43 是一件很难搞的事 xff0c windows不像linux那样能方便地对各种C 43 43 软件包进行管理 xff0c 直到发现了vcpkg这个包管理器 x