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.cpp
和CMakeLists.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
}
}
常见问题
1.zsh终端中使用vcpkg安装指定特性的库提示找不到?
例如,使用vcpkg install imgui[wchar32]
命令安装imgui库时,会提示zsh: no matches found: imgui[wchar32]
。这是由于zsh对字符的解析规则导致无法正确解析安装命令,需要使用单引号将库包括起来vcpkg install 'imgui[wchar32]'
。
Comments | NOTHING