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

我刚开始的时候。假设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.我知道这种方式是不正确的方式。我之所以使用它,是因为我没有找到其他方法。如果您能帮助我在静态导入库上添加此依赖项,或者建议另一种如何实现我在开始时描述的目标的方法,我将不胜感激。

最佳答案

我一直在寻找的功能(将静态导入库与其他导入库添加依赖项)称为传递链接。通过设置目标属性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)

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

关于c++ - 如何使静态导入的库依赖于CMake中的另一个静态导入的库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28080641/

10-12 18:17