簡體   English   中英

CMake 依賴和 Dll 副本

[英]CMake dependencies and Dll copies

我確實寫了一些 CMake 代碼來傳遞獲取給定可執行目標的所有庫依賴項並復制它旁邊的 dll(是的 Windows 世界)

然后我得到了一個不支持 CMake 的外部庫。 有一個 implib 讓我們用 a.dll 調用它 a.lib,這個庫還依賴於另一個 dll 沒有任何可用的 implib (b.dll)

所以我寫了一個 aConfig.cmake 像這樣:

set(a_FOUND TRUE)

add_library(a SHARED IMPORTED)
set_target_properties(a PROPERTIES
    IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
    IMPORTED_LOCATION "${a_DIR}/bin/a.dll"
    IMPORTED_IMPLIB "${a_DIR}/lib/a.lib"
)

add_library(b SHARED IMPORTED)
set_target_properties(b PROPERTIES
    IMPORTED_LOCATION "${a_DIR}/bin/b.dll"
)

# to express a dependency without requiring implib at link time
target_link_library(a PRIVATE b)

我最終遇到了這個(預期的)錯誤

IMPORTED library can only be used with the INTERFACE keyword of
  target_link_libraries

然后我把b修改成了INTERFACE(這里感覺怪怪的):

add_library(b INTERFACE IMPORTED)
set_target_properties(b PROPERTIES
    IMPORTED_LOCATION "${a_DIR}/bin/b.dll"
)
target_link_library(a INTERFACE b)

使用 CMake 3.18 我的傳遞循環不想在 INTERFACE 上請求 IMPORTED_LOCATION

  INTERFACE_LIBRARY targets may only have whitelisted properties.  The
  property "IMPORTED_LOCATION" is not allowed.

但是使用 CMake 3.19 它可以正常工作並且完全符合我的預期。 所以我閱讀了發行說明,除了這個聲明

Interface Libraries may now have source files added via add_library() or target_sources(). Those with sources will be generated as part of the build system.

似乎與此無關。

由於我發現了 CMake 3.18 錯誤,我覺得我所做的事情是錯誤的,但是我找不到更好的方法來表達這種運行時依賴。

有沒有人對如何表達這種依賴有更好的想法,或者感覺像這樣?

在 CMake 3.19 和之后,您可以為 dll 創建b目標,而單行中沒有庫:

add_library(b INTERFACE "${a_DIR}/bin/b.dll")

因此,當您將ab鏈接時, a將從文件${a_DIR}/bin/b.dll中獲得依賴關系。

這就是 CMake 3.19 引入的內容:來自文件的 INTERFACE 庫的依賴關系。

為了在 CMake pre-3.19 中實現該依賴項,需要創建額外的自定義目標:

add_custom_target(b_files DEPENDS "${a_DIR}/bin/b.dll")

add_library(b INTERFACE)
add_dependencies(b b_files)

暫無
暫無

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

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