为什么要在CMake中使用软件包管理器?

时间:2019-04-09 09:46:08

标签: c++ cmake

我目前正在评估一个工作中的项目的C ++程序包管理器,并且开始怀疑为什么当CMake和远程DVCS服务器似乎可以解决问题时,为什么需要它们。

在我的个人项目中,我使用ExternalProject提取并构建我拥有的所有依赖项。同时,柯南,vcpkg,猎人和可能其他人声称做同样的事情。

例如,

vcpkg似乎要求每个项目都有一个.cmake文件,以便它可以与CMake find_package一起使用。

那么,为什么要完全使用包管理器?

2 个答案:

答案 0 :(得分:3)

虽然直接使用CMake的ExternalProject_Add可以具有诸如完全匹配的编译标志之类的优点,但是正确配置软件包并不总是那么简单。此外,包管理器允许您在项目之间重用依赖源和二进制文件,从而大大减少了存储需求。即使从源构建的vcpkg之类的程序包管理器也是如此,因为它们仅下载源一次(并且每个配置生成一次以生成二进制文件),而不是每个每个构建文件夹(以及每个二进制配置)一次。 。而且这些节省可能是可观的,尤其是对于Qt之类的依赖项,其大小为数GB。类似地,您还节省了很多时间。

TL; DR:

  • 易于使用
  • 降低的存储要求(如果您多次使用一个库)
  • 减少了构建时间(如果程序包管理器具有二进制程序包,或者您多次使用一个库)

答案 1 :(得分:1)

如果您有多个(独立构建的)项目,并且它们使用许多相同的库,则诸如hunter或vcpkg之类的程序包管理器将(每个构建平台)仅编译和存储一次库,从而节省了构建时间和磁盘空间。

但是,如果您的项目是一起构建的,并且可以针对多个平台(Windows x86,Windows x64,macOS,Linux,iOS,Android(4个不同的ABI),WebAssembly等)进行交叉编译,那么的确可能会更好直接使用FetchContentExternalProject

对我来说,这是第二种情况(Scapix项目),最后我专门为这种情况创建了一个小型且非常简单的“程序包管理器”(cmodule):它仅共享下载的内容和解压缩的库资源,而构建是整个项目构建的一部分。