【CMake】vcpkg + CMake
除了Conan外,vcpkg也是不错的C++包管理工具。跟conan相比,vcpkg是源码级的包管理,安装包的时候同时在本地编译。
安装vcpkg
vcpkg支持众多架构,有arm-uwp, arm-windows, arm64-uwp, arm64-windows, x64-linux, x64-osx, x64-uwp, x64-windows, x64-windows-static, x86-uwp, x86-windows, x86-windows-static。 下面我已curl包为事例,介绍vcpkg的安装和使用。
# 下载vcpkg项目
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
# 本地编译
.\bootstrap-vcpkg.bat
# 安装指定的包,curl包分号后面的表示架构,可用的值为之前列出的那些。
vcpkg install curl:x64-windows
# 已安装的包更新
vcpkg upgrade
# 列出已经安装的包
vcpkg list
# 删除已安装的包
vcpkg remove curl:x64-windows
# 集成
# 为每一个用户设置
vcpkg integrate install
# 为当前项目配置,这里需要在该项目的目录下拥有一份vcpkg的拷贝
vcpkg integrate project
安装包
默认32位
vcpkg install gtest
vcpkg install benchmark
在CMake中使用vcpkg
cmake_minimum_required(VERSION 3.5)
# 设置VCPKG_ROOT所在的位置
set(VCPKG_ROOT "${CMAKE_SOURCE_DIR}/../vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE PATH "")
set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT})
project(TEST_NOW)
find_package(GTest CONFIG REQUIRED)
find_package(benchmark CONFIG REQUIRED)
add_subdirectory(string_test)
增加依赖库
target_link_libraries(string_test PRIVATE GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)
target_link_libraries(string_test PRIVATE benchmark::benchmark benchmark::benchmark_main)
代码中可以直接使用benchmark:
#include <string>
#include <benchmark/benchmark.h>
static void BM_STRING(benchmark::State& state)
{
for (auto _ : state) {
for (int ii = 0; ii < 1000000; ++ii)
{
std::string x("https://blog.csdn.net/mythma");
x.c_str();
}
}
}
BENCHMARK(BM_STRING);
BENCHMARK_MAIN();
vcpkg使用中的常见问题
vcpkg和cmake合作使用时,明明CMakefile编写正确,但是却一直找不到第三方引用呢?
面对这种情况需要从以下几个方面去排查。
- 第一,CMAKE_TOOLCHAIN_FILE是否设置为了vcpkg.cmake文件路径了?如果设置了的话,是否是在project()命令之前,因为如果在project命令之后的话就无效了。
- 第二,对vcpkg.cmake预设好的变量是否进行了覆盖操作?我之前就放过错误,将vcpkg.cmake中预设的变量CMAKE_PREFIX_PATH覆盖,结果导致无法引入第三方包的问题