vcpkg 是 Microsoft 和 C++ 社区维护的免费开放源代码 C/C++ 包管理器。 它于 2016 年推出,可帮助开发人员将项目迁移到较新版本的 Visual Studio。 vcpkg 已演变成 Windows、macOS 和 Linux 上开发人员使用的跨平台工具。 vcpkg 拥有大量开放源代码库注册表和企业就绪功能,旨在通过支持任何构建和项目系统来促进开发过程。 vcpkg 是核心的 C++ 工具,使用 CMake 中的脚本以 C++ 语言编写。 它从头开始设计,以解决 C/C++ 开发人员体验的独特难点。
从 Visual Studio 2022 开始,vcpkg 已经被包含在 Visual Studio Installer 中,你可以直接在安装或修改 Visual Studio 时选择安装 vcpkg。具体步骤如下:
C:\dev
,将vcpkg从github中克隆到当前文件夹中git clone https://github.com/microsoft/vcpkg.git
cn vcpkg && bootstrap-vcpkg.bat
运行成功,会给出如下提示
C:\dev\vcpkg
添加后确定。HelloWorldVS
,并选中“将解决方案和项目放在同一目录中”的复选框,点击“创建”vcpkg new --application
运行成功后,可以看到项目目录中多了一个vcpkg.json
文件和一个vcpkg-configuration.json
文件
fmt
包作为依赖项:vcpkg add port fmt
运行成功后,可在vcpkg.json
文件中看到:
{
"dependencies": [
"fmt"
]
}
CMakePresets.json
文件:CMakePresets.json
文件重命名为CMakeUserPresets.json
替换为至 vcpkg 目录的路径。{
"version": 2,
"configurePresets": [
{
"name": "default",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": "/scripts/buildsystems/vcpkg.cmake"
}
}
]
}
CMakeList.txt
文件在vs自动创建项目时自动生成的CMakeList.txt
中添加一下两行代码,并重新"生成CMake缓存"
find_package(fmt CONFIG REQUIRED)
target_link_libraries(HelloWorldVS PRIVATE fmt::fmt)
HelloWorldVS.cpp
文件#include "HelloWorldVS.h"
#include
using namespace std;
int main()
{
cout << "Hello CMake." << endl;
fmt::print("Hello World.");
return 0;
}
a. 生成项目
按下 Ctrl+Shift+B
以在 Visual Studio 中生成项目。
b. 运行应用程序
选择并运行可执行文件
可以看到输出:
示例代码下载:HelloWorldVS.zip
C:\dev\vcpkg
)CMake
。vcpkg.json
)b. 在弹出的Location对话框中,可以输入文件名(默认为vcpkg.json
)和路径(默认为当前项目路径);可以编辑清单内容(默认添加了fmt库)
c. 完成后,项目中会自动生成一个vcpkg.json
文件,同时并将该文件添加到了CMakeList.txt中
CMakeList.txt
文件中,注意需要将target_link_libraries
中的目标改为当前项目的可执行文件名(如将main
改为HelloWorld
)/
main.cpp
,并构建运行示例代码下载:HelloWorldQT
报错: could not find a package configuration file provided by "fmt" with any of ...
解决方法:
a. 检查CMAKE_TOOLCHAIN_FILE
变量值路径是否设置正确;
b. 如设置正确,若在vs中重新生成一下cmake的缓存,若在qt Creator中则点击Re-configure with Initial Parameters
重新生成一下cmake的配置;
报错:The plain signature for target_link_libraries has already been used with ...
解决方法:
在使用target_link_libraries
过程中,要么为所有元素指定PUBLIC// PRIVATE,要么不指定。
在本例中,我们只需要删除target_link_libraries中的PRIVATE,再来执行CMake即可。