【问题标题】:Cmake question: How do I use vcpkg to install dependencies automatically?Cmake问题:如何使用vcpkg自动安装依赖?
【发布时间】:2020-04-03 17:08:44
【问题描述】:

我正在 Linux 机器上开发 c++ 项目,它使用了几个 boost 库。我已经使用 vcpkg 将它们安装在我的系统上,并使用 vcpkg 提供的工具链构建它。我的问题是: 如果要构建依赖项,如何定义依赖项以便它们自动安装在不同的系统上? 柯南有办法通过在 conanfile.txt 中定义依赖关系来做到这一点。我如何对 vcpkg 做同样的事情?

Edit1:我找到了autovcpkg,它可以完成我想做的工作,但可以在 cmakelists.txt 中或通过 vcpkg 本身完成相同的工作吗?

【问题讨论】:

  • AFAIK 没有“内置”方法可以通过 CMake 执行此操作。不过,autovcpkg 似乎很合适。它会为您完成您必须通过 cmake 手动执行的操作。
  • 感谢您告诉我。 vcpkg 中是否存在以下功能的 PR 或问题?
  • 您的意思是自动构建依赖项吗?不,我认为这超出了 vcpkg 试图做的范围。目前你能做的最好的事情(如果你在 Windows 上)是使用 vcpkg 集成命令使库在你的系统上全局可用,但我觉得这打破了使用 cmake 的想法,因为它是跨平台的。跨度>
  • 我想要一些类似于柯南在conanfile.txt 中所做的事情。

标签: c++ cmake vcpkg


【解决方案1】:

我发现 autovcpkg 可以完成我想做的工作,但同样可以在 cmakelists.txt 中本地完成还是由 vcpkg 本身完成?

您可以通过提供CONTROLportfile.cmake 文件为您的库或可执行文件编写一个vcpkg 端口。在 CONTROL 文件中定义所有依赖项和可能的功能,而 portfile 包含构建指令。您可以使用vcpkg create <myport> <url> <filename> 从可根据您的需要定制的模板创建CONTROLportfile.cmake。 与端口叠加一起,此端口也可以被其他人使用,而无需合并到 vcpkg/master

【讨论】:

  • 您能否提供有关如何执行此操作的文档的链接?
【解决方案2】:

如果您将 vcpkg 作为项目的子模块,define a manifest 用于您希望 vcpkg 构建的库,并且正在使用 vcpkg CMake 工具链 - 那么您将获得所需的一切。

  1. 将 vcpkg 添加为子模块意味着您的用户不需要自己安装它,CMake 工具链将代您安装它。这也意味着您可以修复软件包版本
  2. 使用清单文件是您以编程方式告诉 vcpkg 在 CMake 配置阶段获取和构建哪些包的方式
  3. 使用 CMake 工具链文件是将其绑定到项目构建系统的唯一方法
$ git clone .../my_project
$ cd ./my_project
$ git submodule update --init
$ mkdir ../build
$ cd ../build
$ cmake ../my_project
-- Running vcpkg install
-- Running vcpkg install - done
...

【讨论】: