Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使静态导入库依赖于CMake中的另一个静态导入库?_C++_Cmake - Fatal编程技术网

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

C++ 如何使静态导入库依赖于CMake中的另一个静态导入库?,c++,cmake,C++,Cmake,我希望我的项目的某些部分(很少更改)以静态方式编译并“安装”在单独的目录中。这是必要的,因为由于项目的某些细节,它经常必须从头开始重新编译(删除整个构建目录)。在单独的目录中“安装”静态链接的库将大大减少构建时间 我一开始就有的。假设LibA很少更改,我希望它只安装一次,而不是在大多数项目构建期间重建。LibA依赖于某些第三方导入的LibC库。项目还包含经常更改的LibB,它依赖于LibA CMakeLists.tst (LibB): target_link_libraries("LibB"

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

我一开始就有的。假设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)
CMakeLists.tst (LibB):
  target_link_libraries("LibB" LibA)
在这种情况下,在链接LibB期间,我们将依赖LibA和LibC。每次在建立LibB之前,我们都会重建LibA

为了避免不必要的重建,我创建了新的目标“LibA”(而不是“LibA_build”),所以现在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的依赖关系


另外,我知道这种方法不合适。我之所以使用它,只是因为我没有找到其他方法。如果您能帮助我添加对静态导入库的依赖性,或者建议另一种实现我在Beginning上描述的目标的方法,我将不胜感激。

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

例如,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)

希望这些信息对其他人有用。

您可以制作一个自定义目标,它可以“清除”“仅适用于
libA
或任何项目的特定部分损坏,需要经常从头开始构建。或者您可以修复根本原因,这似乎是因为重建必须从头开始。嗯,我更信任“rm-rf*”而不是清洁:)无论如何,谢谢您的建议。我的观点是,如果需要,您可以在CMake中编写一个运行
rm-rf
的自定义目标。有时我需要删除所有构建文件夹。用手或通过某个CMake目标来实现这一点并不重要。无论如何,现在在删除build文件夹后,我将不得不重建所有那些很少更改的库。所以,如果我正确理解了你的观点,它将不允许改进构建时间(我的主要目标)。顺便问一下,有没有办法在CMake中创建“假”目标?我指的是我可以在LibB中作为依赖项提供的一些目标。对于这个目标,我可以提供LibA和LibC作为依赖项。在这种情况下,我认为,它也可以解决问题。