【发布时间】:2021-12-27 15:46:44
【问题描述】:
我确实编写了一些 CMake 代码来传递获取给定可执行目标的所有库依赖项并复制它旁边的 dll(是的 Windows 世界)
然后我得到了一个不支持 CMake 的外部库。有一个 implib 让我们用 a.dll 将它称为 a.lib,这个库还依赖于另一个没有任何可用 implib (b.dll) 的 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 它可以正常工作并且完全符合我的预期。所以我阅读了发行说明,除了这个statement:
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错误,感觉自己做的不对,但是找不到更好的方式来表达这种运行时依赖。
有没有人对如何表达这种依赖有更好的想法或者感觉像这样?
【问题讨论】: