我目前正在评估一个工作中的项目的C ++程序包管理器,并且开始怀疑为什么当CMake和远程DVCS服务器似乎可以解决问题时,为什么需要它们。
在我的个人项目中,我使用ExternalProject提取并构建我拥有的所有依赖项。同时,柯南,vcpkg,猎人和可能其他人声称做同样的事情。
例如,vcpkg似乎要求每个项目都有一个.cmake文件,以便它可以与CMake find_package一起使用。
那么,为什么要完全使用包管理器?
答案 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等)进行交叉编译,那么的确可能会更好直接使用FetchContent
或ExternalProject
。
对我来说,这是第二种情况(Scapix项目),最后我专门为这种情况创建了一个小型且非常简单的“程序包管理器”(cmodule):它仅共享下载的内容和解压缩的库资源,而构建是整个项目构建的一部分。