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

一直以来,笔者都认为在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)

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

其他常用命令:

  • 列出已安装的package

    vcpkg list
    
  • 可移除指定的package

    vcpkg remove 
    

添加环境变量

注意:如果将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=/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 
#include 
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就会对程序进行编译、运行

在这里插入图片描述

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

Windows的C++开发环境搭建(基于vcpkg+CMake)_第1张图片

在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一段时间后,会发现它占用了很大的磁盘空间

Windows的C++开发环境搭建(基于vcpkg+CMake)_第2张图片

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

Windows的C++开发环境搭建(基于vcpkg+CMake)_第3张图片

参考

vcpkg总览

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

vcpkg快速使用教程

你可能感兴趣的:(高效开发,windows,c++,vcpkg,vscode,vs)