代码之家  ›  专栏  ›  技术社区  ›  Ken Y-N

安装包含目录中定义的目标

  •  0
  • Ken Y-N  · 技术社区  · 7 年前

    考虑以下因素 CMakeLists.txt 文件:

    add_subdirectory(execA)
    add_subdirectory(libB)
    
    install(TARGETS execA libB
            RUNTIME DESTINATION bin
            LIBRARY DESTINATION lib
            ARCHIVE DESTINATION lib)
    

    我得到以下错误:

    install TARGETS given target "execA" which does not exist in this
      directory
    

    execA 和 libB 有自己的 CMakeList.txt 文件和位于 project 目录,以及我正在运行的构建目录 cmake ( cmake .. ):

    project
      |------ CMakeList.txt (the one with the code)
      |----execA
      |      \- .cpp, .hpp and CMakelist.txt
      |----libB
      |      \- .cpp, .hpp and CMakelist.txt
      |---- lib
      |---- bin
      \---- build (where I´m commanding: $ cmake ..
    

    如何修复此错误?

    0 回复  |  直到 7 年前
        1
  •  21
  •   Tsyvarev    7 年前

    根据 this bugreport , install(TARGETS) 命令流仅接受目标 在同一目录中创建 .

    所以你需要 add_library() 调用顶级目录,或拆分 安装(目标) 调用每个目标,并将每个目标移动到相应的子目录中。

    自CMake 3.13以来 安装(目标) can work 即使在其他目录中创建了目标。

    安装(目标) 可以安装在其他目录中创建的目标。使用此类跨目录安装规则时,运行 make install 子目录中的目标(或类似目标)不能保证其他目录中的目标是最新的。

        2
  •  5
  •   skypjack    10 年前

    尽管这有助于看到 CMakeLists.txt 子目录中包含的文件,我猜它们包含 add_executable 和/或 add_library 语句来创建您的内容。
    此外,由于您的示例,我猜您正在使用相同的目录名称作为目标。
    也就是说,您应该知道 CMakeLists。txt文件 默认情况下,子目录中的文件在 CMakeLists。txt文件 父目录中的文件。因此,你应该 install 中的声明 CMakeLists。txt文件 子目录中的文件。
    如果我的想法是对的,这应该可以解决问题。否则,我强烈建议您在您的问题中也张贴上述其他文件的内容。

    无论如何,错误是很明显的。
    包含 安装 名为的目标的语句 X 不包含目标创建语句( 添加\u可执行文件 以及其他)生成该目标,所以它继续说该目标不存在于该目录中。

        3
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    这似乎仍然是CMake 3.11中的一个痛点。

    在我们的代码库中,我们在子目录中定义了许多目标,需要创建具有不同配置和目标组合(可能重叠)的各种安装程序。

    以下是我的解决方案:

    • 通话前 add_subdirectory 在你的根目录中。txt文件,创建 GLOBAL 属性,其中包含要包含在安装程序中的目标的名称。
    • 包装目标创建函数( add_executable ,等等)在您自己的自定义函数中。在这些函数中,检查目标是否存在于全局属性中,并调用 install 照着

    这种方法允许您集中安装程序配置。

    另外:为了支持创建多个安装程序,我们将全局列表与其他安装程序属性一起填充到单独的中。cmake文件。当我们调用 cmake ,我们将安装程序配置CMake文件的名称作为命令行参数传递。我们的根CMakeLists。txt文件仅调用 include 使用该文件。

    推荐文章