2016-03-05 64 views
6

CMake manual of Qt 5使用find_package說:每個模塊的Qt創建通過`find_package`獲取導入的目標?

進口的目標。應該首選導入的目標名稱,而不是在CMake命令(如target_link_libraries)中使用像Qt5<Module>_LIBRARIES這樣的變量。

它是特殊的Qt的或不find_package產生進口目標所有庫? documentation of find_package in CMake 3.0說:

當找到包時,通過變量和包自己記錄的導入目標提供特定於包的信息。

而且manual for cmake-packages說:

使用find_package的結果要麼是一組IMPORTED目標,或一組相應建立相關的信息的變量。

但我沒有看到另一個FindXXX.cmake -script在文檔中說,一個進口目標創建。

回答

6

find_package是雙頭獸這些天:

CMake提供了兩種形式的套餐,Config-file PackagesFind-module Packages

Source

現在直接支持,這是什麼其實是指?

查找模塊包是你可能最熟悉的。他們執行一個CMake代碼的腳本(如this one),它執行一系列函數,如find_libraryfind_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。

2

其實沒有「魔法」,結果爲find_package:該命令只是搜索適當的FindXXX.cmake腳本並執行它。

如果查找腳本設置爲XXX_LIBRARY變量,則調用者可以使用此變量。

如果查找腳本創建導入的目標,則調用者可以使用這些目標。

如發現腳本既不設置XXX_LIBRARY變量也不產生進口目標......好了,那麼腳本的使用是有點不同。

find_package的文檔描述了通常使用查找腳本。但無論如何,您需要查閱有關具體腳本的文檔(本文檔通常包含在腳本本身中)。