[英]Multiple processes and copies of static DLL data in COM DLL dependencies
[英]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")
因此,當您將a
與b
鏈接時, 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.