C++包管理工具vcpkg的使用

前言

  最近在使用c++时,发现编译第三方库真的烦,同时还要在vs的设置中引入包含目录、库目录,操作起来十分繁琐。之后github上找到了vcpkg这个微软开发的包管理工具,用起来挺顺手的,就是下载包的时候,由于包服务器在外网,很多时候会安装失败,这是一个苦恼的问题。最近,在一片博客看到有大佬搭建国内个人镜像,没有梯子的,可以去了解一下

安装

  安装很简单,可以参考github提供的README.md

  1. 首先第一步从vcpkg仓库把代码clone下来:
    1
    2
    > git clone git@github.com:microsoft/vcpkg.git
    > cd vcpkg
  2. 然后第二步,使用命令编译vcpkg
    1
    2
    > .\bootstrap-vcpkg.bat   //windows下
    > ./bootstrap-vcpkg.sh //Linux下
  3. 第三步,为了方便操作,可以将目录下生成的vcpkg可执行文件,加入到系统的环境变量
  4. 第四步,为全局配置vcpkg
    1
    > vcpkg integrate install
      在这一步之后,在windows下,VS中,可以直接在头部引入安装的库使用,不需要其他包含库目录等操作,十分方便。
      对于不使用vs的情况,vcpkg可以在cmake中使用,通过编译参数-DCMAKE_TOOLCHAIN_FILE = [vcpkg root]\scripts\buildsystems\vcpkg.cmake,进行配置,实例如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    cmake_minimum_required (VERSION 3.8)

    project(ManagerServer)
    set(CMAKE_CXX_STANDARD 14)

    #G:/c++ Depende/vcpkg, 是我的vcpkg的根目录,在使用的时候需要更换为自己的
    set(VCPKG_ROOT "G:/C++ Depende/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE PATH "")
    set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT})

    #这个是查找sqlite3库的操作, 安装sqlite3的操作,请看文章的下一部分
    find_package(sqlite3 CONFIG REQUIRED)

    aux_source_directory(. sourceList)

    # 将源代码添加到此项目的可执行文件。
    add_executable (ManagerServer ${sourceList})

    #进行sqlite3库的链接
    target_link_libraries(ManagerServer PRIVATE sqlite3)

使用

  接下来是关于vcpkg的使用,本文以官方文档描述的安装和使用sqlite3的例子来介绍。

  1. 通过search参数来查找提供的第三方包

    1
    2
    3
    4
    5
    6
    7
    > vcpkg search sqlite3
    dlib[sqlite3] sqlite3 support for dlib
    soci[sqlite3] Build sqlite3 backend
    sqlite3 3.32.0-0 SQLite is a software library that implements a self-contained, serverless, zer...
    sqlite3[tool] sqlite3 executable
    sqlitecpp 3.0.0 SQLiteC++ (SQLiteCpp) is a smart and easy to use C++ SQLite3 wrapper.
    sqlpp11-connector... 0.29-2 A C++ wrapper for sqlite3 meant to be used in combination with sqlpp11.
  2. 通过install命令来安装包
      在安装包之前,需要查看本机的VS环境是否安装的English的语言包,否则,会出现警告和报错的问题。接下来,是使用install安装第三方包,示例的环境是windows10。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    > vcpkg install sqlite3
    Computing installation plan...
    The following packages will be built and installed:
    sqlite3[core]:x86-windows
    Starting package 1/1: sqlite3:x86-windows
    Building package sqlite3[core]:x86-windows...
    -- Using cached G:/C++ Depende/vcpkg/downloads/sqlite-amalgamation-3320000.zip
    -- Using source at G:/C++ Depende/vcpkg/buildtrees/sqlite3/src/3320000-f17e2f22e8
    -- Configuring x86-windows
    -- Building x86-windows-dbg
    -- Building x86-windows-rel
    -- Performing post-build validation
    -- Performing post-build validation done
    Building package sqlite3[core]:x86-windows... done
    Installing package sqlite3[core]:x86-windows...
    Installing package sqlite3[core]:x86-windows... done
    Elapsed time for package sqlite3:x86-windows: 11.25 s

    Total elapsed time: 11.25 s

    The package sqlite3:x86-windows provides CMake targets:

    find_package(sqlite3 CONFIG REQUIRED)
    target_link_libraries(main PRIVATE sqlite3)

    //在windows下命令默认编译的是x86的包,可以通过":"指定,比如:
    > vcpkg install sqlite3:x64-windows

      在完成安装后,可以看出命令行输出了,在camke中的使用语句,将其写入CMakeLists.txt就可以了,特别要注意target_link_libraries(main PRIVATE sqlite3)add_executable()后面。

  3. 利用list参数,查看已经编译安装的包

    1
    2
    3
    > vcpkg list
    sqlite3:x64-windows 3.32.0-0 SQLite is a software library that implements a s...
    sqlite3:x86-windows 3.32.0-0 SQLite is a software library that implements a s...
  4. 利用remove参数,卸载已经编译安装的包

    1
    > vcpkg remove [package_name]

使用实例

  1. main.cpp文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    // main.cpp
    #include <errno.h>
    #include <sqlite3.h>
    #include <stdio.h>
    int main() {
    sqlite3 *pdb = nullptr;
    int result;

    result = sqlite3_open("test.db", &pdb);
    if (result != SQLITE_OK) {
    perror("sqlite_open error!");
    return -1;
    }

    sqlite3_stmt *pStmt;
    const char *sql =
    "create table Student("
    "t_id, integer primary key, "
    "t_name varchar(15), t_age integer)";

    char *errMsg = NULL;

    result = sqlite3_exec(pdb, sql, NULL, NULL, &errMsg);
    if (result != SQLITE_OK) {
    printf("create table student failed!\n");
    printf("error conde %d \t error message:%s\n", result, errMsg);
    }

    printf("create table success!\n");
    return 0;
    }
  2. CMakeLists.txt文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #CMakeLists.txt

    cmake_minimum_required (VERSION 3.8)
    project(ManagerServer)
    set(CMAKE_CXX_STANDARD 14)

    set(VCPKG_ROOT "G:/C++ Depende/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE PATH "")
    set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT})

    find_package(sqlite3 CONFIG REQUIRED)

    aux_source_directory(. sourceList)

    # 将源代码添加到此项目的可执行文件。
    add_executable (ManagerServer ${sourceList})

    target_link_libraries(ManagerServer PRIVATE sqlite3)

参考文章

  1. vcpkg国内镜像使用方法