當使用兩個依賴包(其中上游包具有可選鏈接庫)時,我正在努力應對基於CMake「Config」的包描述。有條件的傳遞鏈接庫
假設您有libA
,可選擇使用zip功能(例如libA
的CMakeLists.txt
中的某個選項USE_ZLIB
)。這意味着libA
將在其INTERFACE_LINK_LIBRARIES
(導出到liba-config.cmake
)中可選地具有-lz
。 現在,如果你有一個libB
使用libA
通過find_package(libA)
,你怎麼知道libA
已建立有或沒有zlib支持時,這兩個庫安裝和出口與CMake的包配置系統?
我知道鏈接庫信息被傳遞處理,並將傳播到鏈接庫libB
,因此,只要鏈接到libB
,就會出現-lz
。但是,libz的PATH
沒有包括在內;因此,除非您奇蹟般地知道libz
是libA
的鏈接庫並且包含它的位置,否則鏈接將失敗,並顯示「找不到庫z」。 在libA
的配置中包含到libz
的絕對路徑也不是可行的方法,因爲它破壞了在不同系統上的可移植性。
編輯:我一直在收到建議使用target_link_libraries(libA PRIVATE z)
的回覆,例如,聲明(實際上是libA內部的)libz是一個私有庫。不幸的是,這並不能解決問題,因爲CMake通過$<LINK_ONLY:z>
自動將PRIVATE
標記的鏈接庫添加到INTERFACE_LINK_LIBRARIES
列表中。這表明以另一種方式在出口鏈接庫列表中顯示-lz
(以及CMake導出腳本作者理解傳遞性問題)的必要性。
爲什麼'liba-config.cmake'包含'find_package(ZLIB)'並且鏈接到'$ {ZLIB_LIBRARIES}'? –
以及xxx-config.cmake文件是由CMake的安裝(EXPORT ..)命令生成的,這是你不想用來模糊的東西。當然,我腦子裏有很多骯髒的黑客來解決這個問題,但如果有一個正確的CMake本機方式來處理這個問題,我很感興趣。 –
只爲您的信息:http://public.kitware.com/pipermail/cmake-developers/2015-April/025034.html –