簡體   English   中英

為什么要在 CMake 中使用包管理器?

[英]Why use a package manager with CMake?

我目前正在為一個工作項目評估 C++ 包管理器,我開始想知道為什么當 CMake 和遠程 DVCS 服務器似乎可以很好地完成任務時我需要它們。

在我的個人項目中,我使用ExternalProject來提取和構建我擁有的任何依賴項。 與此同時,Conan、vcpkg、hunter 和其他人可能都聲稱在做同樣的事情。

例如,vcpkg 似乎要求每個項目都有一個 .cmake 文件,以便它可以與 CMake find_package 一起使用。

那么,為什么要使用包管理器呢?

雖然直接使用 CMake 的ExternalProject_Add具有編譯標志完全匹配等優勢,但正確配置包並不總是那么簡單。 此外,包管理器允許您在項目之間重用依賴源和二進制文件,從而大大減少存儲需求。 即使在像 vcpkg 這樣從源代碼構建的包管理器中也是如此,因為它們只下載一次源代碼(並且每個配置構建一次以生成二進制文件)而不是每個構建文件夾(以及二進制文件的每個配置)一次。 這些節省可能非常可觀,尤其是對於像 Qt 這樣大小為幾千兆字節的依賴項。 類似地,您也節省了大量時間。

長話短說:

  • 使用方便
  • 減少存儲需求(如果您多次使用圖書館)
  • 減少構建時間(如果包管理器有二進制包或者你多次使用一個庫)

如果您有多個(獨立構建的)項目,並且它們使用很多相同的庫,像 hunter 或 vcpkg 這樣的包管理器將只編譯和存儲庫一次(每個構建平台),從而節省構建時間和磁盤空間。

但是,如果您的項目是一起構建的,並且您針對多個平台(Windows x86、Windows x64、macOS、Linux、iOS、Android(4 種不同的 ABI)、WebAssembly 等)進行交叉編譯,那么使用FetchContent確實可能會更好或直接使用ExternalProject

對我來說,這是第二種情況( Scapix項目),最后我專門為這種情況創建了一個非常簡單的小“包管理器”( cmodule ):它只共享下載和解壓的庫源,而構建作為一部分執行的整體項目建設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM