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

Ale*_*lex 5 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)
Run Code Online (Sandbox Code Playgroud)

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

为了避免不必要的重建,我制作了新的目标"LibA"(而不是"LibA_build".所以现在LibB依赖于"LibA".

CMakeLists.tst (LibB):
  target_link_libraries("LibB" LibA)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

结果:现在在建立LibB之前,我们没有重建LibA.

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

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

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

Ale*_*lex 3

我正在寻找的功能(添加静态导入库对其他导入库的依赖)称为传递链接。它是通过设置目标属性IMPORTED_LINK_INTERFACE_LIBRARIES来实现的。他们说这个属性已被废弃并建议使用 INTERFACE_LINK_LIBRARIES,但在我的例子中(cmake 版本 2.8.11.2)只有 IMPORTED_LINK_INTERFACE_LIBRARIES 可以工作。

\n\n

例如,LibA 的 CMakeLists.tst 末尾应如下所示:

\n\n
  add_library(LibC STATIC IMPORTED)\n  a\xcc\xb6d\xcc\xb6d\xcc\xb6_\xcc\xb6d\xcc\xb6e\xcc\xb6p\xcc\xb6e\xcc\xb6n\xcc\xb6d\xcc\xb6e\xcc\xb6n\xcc\xb6c\xcc\xb6i\xcc\xb6e\xcc\xb6s\xcc\xb6(\xcc\xb6L\xcc\xb6i\xcc\xb6b\xcc\xb6A\xcc\xb6 \xcc\xb6L\xcc\xb6i\xcc\xb6b\xcc\xb6C\xcc\xb6)\xcc\xb6\n  set_property(TARGET LibC PROPERTY IMPORTED_LOCATION /path/to/LibC)\n\n  set_property(TARGET LibA PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES LibC)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n