vcpkg的安装与使用

  在C++的编程开发中,第三方库一直是一个难以维护的存在,不少人会遇到第三方库的编译和使用问题。微软推出的Vcpkg可以帮助开发者在Windows、linux和MacOS上管理c/c++库。开发者可以像使用linux中的apt包管理器一样轻松的安装第三方库。
  本文记录一下在Windows平台上使用Vcpkg+cmake+mingw+VS Code进行C++的开发过程。

环境介绍

  本文使用的平台和软件版本如下:

  • 操作系统:Windows 11家庭中文版22H2
  • Vcpkg:version 2023-04-07-bedcba5172f5e4b91caac660ab7afe92c27a9895
  • cmake:cmake version 3.21.0-rc1
  • mingw:x86_64-8.1.0-release-posix-seh-rt_v6-rev0
  • Visual Studio Code:1.78.0(x64)
  • git:2.34.1.windows.1
  • Visual Studio:Professional 2019

vcpkg的安装

  vcpkg的安装完全参照官方教程。本文在Windows平台上进行安装和使用,但是依然记录在其他平台的安装方法。安装过程,可能需要科学上网,视个人网络环境而定。

windows

环境要求

  • Windows7或更高版本
  • Git
  • Visual Studio 2015 Update 3或更新的版本(包含英文语言包)

安装步骤

  • 1.克隆vcpkg仓库
    git clone https://github.com/microsoft/vcpkg
    # 需要说明的是,vcpkg可以安装到任何目录下,但是最好保证全英文的短路径
  • 2.执行脚本
    ./vcpkg/bootstrap-vcpkg.bat
    # 运行之后,脚本会自动下载vcpkg的可执行文件,建议将其加入到环境变量中,以便于在任何位置都能够使用该命令

linux

环境要求

  • Git
  • g++>=6

安装步骤

  • 1.安装开发工具包
    # 在不同的linux发行版中,使用不同的包管理器安装开发工具包
    # Debian Ubuntu popOS
    sudo apt-get update
    sudo apt-get install build-essential tar curl zip unzip
    #CentOS
    sudo yum install centos-release-scl
    sudo yum install devtoolset-7
    scl enable devtoolset-7 bash
  • 2.克隆vcpkg仓库
    git clone https://github.com/microsoft/vcpkg
  • 3.执行脚本
    ./vcpkg/bootstrap-vcpkg.sh

macos

环境要求

  • Apple Developer Tools

安装步骤

  • 1.安装开发工具包
    xcode-select --install
  • 2.克隆vcpkg仓库
    git clone https://github.com/microsoft/vcpkg
  • 3.执行脚本
    ./vcpkg/bootstrap-vcpkg.sh

vcpkg的使用

安装第三方库

  在linux和macOS上可以直接使用vcpkg install package_name安装第三方库。另外,可以使用vcpkg search package_name搜索可供安装的第三方库,可以使用vcpkg list显示已经安装的第三方库。
  在Windows操作系统中,vcpkg默认使用MSVC编译并安装x86版本的库,如果需要安装x64版本,则需要指定:

vcpkg install package_name:x64-windows

  如果想使用MinGW编译生成的库,可以通过指定三元组进行安装。比如,要安装使用mingw编译的x64版本的动态jsoncpp库,可以使用下面的指令:

vcpkg install jsoncpp:x64-mingw-dynamic

使用第三方库

在Visual Studio中使用

  Vcpkg提供了命令可以将Vcpkg中的第三方库集成安装以供Visual Studio使用,命令如下:

# 可能需要管理员权限
vcpkg integrate install

  如果在Visual Studio中使用CMake项目,则需要将vcpkg toolchain文件路径加入到CMake toolchain file中,vcpkg toolchain文件路径如下:

[vcpkg root]/scripts/buildsystems/vcpkg.cmake

在Visual Studio Code中使用

  在工作区的settings.json添加CMake的配置项即可,CMake Tools则会自动使用vcpkg中的第三方库:

{
  "cmake.configureSettings": {
    "CMAKE_TOOLCHAIN_FILE": "[vcpkg root]/scripts/buildsystems/vcpkg.cmake",
    // "VCPKG_TARGET_TRIPLET": "x64-windows"            //如果固定了某个三元组的设置,需要添加该项
  }
}

在CLion中使用

  在Clion的Toolchains设置中添加CMake选项中添加以下参数即可:

-DCMAKE_TOOLCHAIN_FILE=[vcpkg root]/scripts/buildsystems/vcpkg.cmake

在CMake工程中作为子模块使用

  如果希望将vcpkg作为一个子模块加入CMake工程中时,可以在第一个project()调用之前将以下内容添加到CMakeLists.txt中,而无需将CMAKE_TOOLCHAIN_FILE传递给 CMake调用:

set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
  CACHE STRING "Vcpkg toolchain file")

#如果固定了某个三元组的设置,需要添加该项
set(VCPKG_TARGET_TRIPLET "x64-windows" CACHE STRING "Vcpkg target triplet")     

示例

  这里以安装使用mingw编译的x64版本的动态jsoncpp库为例进行测试。测试中,把vcpgk作为一个子模块添加到CMake工程中,整个目录结构如下所示:

│  CMakeLists.txt
│  main.cpp
│
├─vcpkg
│  └─vcpkg.exe
│  └─xxxx
│  └─xxxx

  使用vcpkg install jsoncpp:x64-mingw-dynamic安装所需要的jsoncpp库。main.cppCMakeLists.txt内容分别如下:
  main.cpp文件:

#include <iostream>
#include "json/json.h"
int main() {
    Json::Value root;
    Json::Value data;
    constexpr bool shouldUseOldWay = false;
    root["action"] = "run";
    data["number"] = 1;
    root["data"] = data;

    if (shouldUseOldWay) {
        Json::FastWriter writer;
        const std::string json_file = writer.write(root);
        std::cout << json_file << std::endl;
    } else {
        Json::StreamWriterBuilder builder;
        const std::string json_file = Json::writeString(builder, root);
        std::cout << json_file << std::endl;
    }
    return EXIT_SUCCESS;
}

  CMakeLists.txt文件:

set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
  CACHE STRING "Vcpkg toolchain file")
set(VCPKG_TARGET_TRIPLET "x64-mingw-dynamic" CACHE STRING "Vcpkg target triplet")

cmake_minimum_required(VERSION 3.16)
project(Demo)
set(CMAKE_CXX_STANDARD 11)

add_executable(Demo main.cpp)
find_package(jsoncpp CONFIG REQUIRED)
target_link_libraries(Demo PRIVATE jsoncpp_lib)

  编译运行结果如下:

{
        "action" : "run",
        "data" :
        {
                "number" : 1
        }
}

当珍惜每一片时光~