find_package
是雙頭獸這些天:
CMake提供了兩種形式的套餐,Config-file Packages 和Find-module Packages
Source
現在直接支持,這是什麼其實是指?
查找模塊包是你可能最熟悉的。他們執行一個CMake代碼的腳本(如this one),它執行一系列函數,如find_library
和find_path
來找出在哪裏找到一個庫。
這種方法的一大優點是它非常通用。只要文件系統上有某些東西,我們就可以找到它。最大的缺點是它通常只提供更多的信息,而不是那個東西的物理位置。也就是說,查找模塊操作的結果通常只是一堆文件系統路徑。這意味着像傳遞依賴或多個構建配置這樣的建模是非常困難的。
如果你正在嘗試查找的東西有本身是用CMake構建的,這會變得特別痛苦。在這種情況下,您已經在構建腳本中建立了一堆模型,您現在需要爲查找腳本進行艱苦的重構,以便它可用於下游項目。
這就是配置文件包閃耀。與查找模塊不同,運行腳本的結果不僅僅是一堆路徑,而是它創建了功能齊全的CMake目標。對於依賴項目,它看起來像依賴項已經構建爲同一項目的一部分。
這允許以非常方便的方式運輸更多的信息。明顯的缺點是配置文件腳本比find腳本複雜得多。因此,你不想自己寫它們,而是讓CMake爲你生成它們。或者讓依賴項提供配置文件作爲其部署的一部分,然後您可以簡單地使用find_package
調用進行加載。這正是Qt5所做的。
這也意味着,如果您的項目是圖書館,請考慮generating a config file as part of the build process。這不是CMake最直接的特點,但結果非常強大。
下面是這兩種方法通常如何看起來像CMake的代碼進行快速對比:
查找模塊風格
find_package(foo)
target_link_libraries(bar ${FOO_LIBRARIES})
target_include_directories(bar ${FOO_INCLUDE_DIR})
# [...] potentially lots of other stuff that has to be set manually
配置文件風格
find_package(foo)
target_link_libraries(bar foo)
# magic!
tl; dr:總是比較喜歡config-fi如果依賴關係提供了它如果沒有,請改用find-script。