【问题标题】:How to make static imported library dependent on another static imported library in CMake?如何使静态导入库依赖于 CMake 中的另一个静态导入库?
【发布时间】:2015-03-20 18:21:17
【问题描述】:

我希望我的项目中很少更改的部分被静态编译并“安装”在单独的目录中。这是必要的,因为由于项目的某些细节,它经常必须从头开始重新编译(删除整个构建目录)。在单独的目录中“安装”静态链接库将大大减少构建时间。

我一开始所拥有的。假设 LibA 很少更改,我希望它只安装一次,而不是在大多数项目构建期间重新构建。 LibA 依赖于一些第 3 方导入的库 LibC。项目还包含经常变化的 LibB,依赖于 LibA。

CMakeLists.tst (LibB):
  target_link_libraries("LibB" LibA_build)

CMakeLists.tst (LibA):
  add_library(LibA_build ...)
  add_library(LibC STATIC IMPORTED)
  add_dependencies(LibA_build LibC)

在这种情况下,在链接 LibB 期间,我们将依赖于 LibA 和 LibC。并且每次在构建 LibB 之前,我们都会重新构建 LibA。

为了避免不必要的重建,我创建了新目标“LibA”(而不是“LibA_build)。所以现在 LibB 依赖于“LibA”。

CMakeLists.tst (LibB):
  target_link_libraries("LibB" LibA)

我将这个新目标声明为导入库。

CMakeLists.tst (LibA):
  # This target is for building and installing
  add_library(LibA_build ...)
  SET_TARGET_PROPERTIES(LibA_build PROPERTIES OUTPUT_NAME LibA)
  install(
    FILES /build/path/to/LibA.lib
    DESTINATION /installed/path/to/LibA
  )

  # This target is for linking LibA with another libraries
  add_library(LibA STATIC IMPORTED GLOBAL)
  set_property(TARGET LibA PROPERTY IMPORTED_LOCATION /installed/path/to/LibA)

  add_library(LibC STATIC IMPORTED)
  add_dependencies(LibA LibC)

结果:现在在构建 LibB 之前,我们没有重新构建 LibA。

问题:因为现在 LibA 变成了导入库,CMake 拒绝看到 LibA 对 LibC 的依赖。事实上,LibB 的链接指令仅包含对 LibA 的依赖,但不依赖于 LibC。如果在 Windows 下进行 buildign,则会导致无法解决的外部链接错误。

问题:如何让静态导入库LibA依赖另一个静态导入库LibC?因此,在链接 LibB 的情况下,用于链接的指令将包含对 - LibA 和 LibC 的依赖。

附:我知道这种方式不是正确的方式。我使用它只是因为我没有找到任何其他方法。如果您能帮我添加对静态导入库的依赖或提出另一种方法来实现我在开始时描述的丰富目标,我将不胜感激。

【问题讨论】:

  • 您可以创建一个自定义目标,该目标仅针对libA 或您项目的任何特定部分被破坏并需要从头开始频繁构建。或者你可以解决根本原因,这似乎是重建必须从头开始的事实。
  • 好吧,我更相信“rm -rf *”而不是清洁 :) 无论如何,谢谢你的建议。
  • 我的意思是,如果你愿意,你可以在 CMake 中编写一个运行 rm -rf 的自定义目标。
  • 有时我需要删除所有构建文件夹。手动或通过某些 CMake 目标来完成 - 没关系。无论如何,现在删除构建文件夹后,我将不得不重建所有那些很少更改的库。因此,如果我正确理解了您的观点,那么将无法缩短构建时间(我的主要目标)。
  • 顺便说一句,有没有办法在 CMake 中创建“假”目标?我的意思是我可以在 LibB 中作为依赖项提供的一些目标。对于这个目标,我可以提供 LibA 和 LibC 作为依赖项。在这种情况下,我认为它也可以解决问题。

标签: c++ cmake


【解决方案1】:

我正在寻找的功能(添加静态导入库对其他导入库的依赖)称为传递链接。它是通过设置目标属性IMPORTED_LINK_INTERFACE_LIBRARIES来实现的。他们说此属性已被贬低并建议使用 INTERFACE_LINK_LIBRARIES,但在我的情况下(cmake 版本 2.8.11.2)只有 IMPORTED_LINK_INTERFACE_LIBRARIES 有效。

例如上面的 CMakeLists.tst 的 LibA 应该是这样的:

  add_library(LibC STATIC IMPORTED)
  a̶d̶d̶_̶d̶e̶p̶e̶n̶d̶e̶n̶c̶i̶e̶s̶(̶L̶i̶b̶A̶ ̶L̶i̶b̶C̶)̶
  set_property(TARGET LibC PROPERTY IMPORTED_LOCATION /path/to/LibC)

  set_property(TARGET LibA PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES LibC)

希望这些信息对某人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2017-08-19
    • 2021-11-21
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多