【问题标题】:CMake dependencies and Dll copiesCMake 依赖项和 Dll 副本
【发布时间】: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错误,感觉自己做的不对,但是找不到更好的方式来表达这种运行时依赖。

有没有人对如何表达这种依赖有更好的想法或者感觉像这样?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多