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

标签 c++ cmake

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

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

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 下构建,它会导致无法解决的外部链接错误。

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

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

最佳答案

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

相关文章:

python - 使用 Python 包装器安装 libfreenect 时发生 CMake 错误

c++ - 如何在编译时检测WP8

c++ - 为什么在 C++ 中使用动态分配的内存时我的编译器会报错

c++ - 指向单例类实例函数的函数指针

c++ - 平滑倾斜线

cmake - 将 Fortify sourceanalyzer 与 CMake 结合使用

c++ - 继承重载成员函数指针的非类型模板形参

c - 使用 cmake 时未定义外部变量的引用

c++ - 导入的目标 "Boost::system"包含不存在的路径 "/include"

cmake - 清理 CMake 安装的文件