如何使静态导入库依赖于CMake中的另一个静态导入库?

时间:2015-01-22 03:05:46

标签: c++ cmake

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

一开始我的所作所为。让我们说LibA很少被改变,我希望它安装一次,而不是在大多数项目构建期间重建。 LibA依赖于某些第三方导入的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的依赖性。

P.S。我知道这种方式不正确。我用它只是因为我没有找到任何其他方式。如果你帮助我在静态导入库中添加这种依赖关系,或者建议另一种方法如何丰富我在开始时所描述的目标,我将非常感激。

1 个答案:

答案 0 :(得分:3)

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

因此,例如,在Liba的CMakeLists.tst结尾之上应该如下所示:

  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)

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