CMake install(子目录中的目标)

lymgl2op  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(129)

考虑以下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


execAlibB有自己的CMakeList.txt文件,位于project目录下,以及我运行cmakecmake ..)的构建目录下:

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 ..


如何修复此错误?

wj8zmpe1

wj8zmpe11#

根据this bugreportinstall(TARGETS)命令流仅接受在同一目录中创建的目标 *。
因此,您需要将add_library()调用移动到顶级目录中,或者将install(TARGETS)调用拆分为每个目标的调用,并将每个调用移动到相应的目录中。
由于CMake 3.13 install(TARGETS)甚至可以与在其他目录中创建的目标一起工作。
install(TARGETS)可以安装在其他目录中创建的目标。当使用这种跨目录安装规则时,从安装程序运行make install(或类似程序)不能保证其他目录中的目标是最新的。

bnl4lu3b

bnl4lu3b2#

即使它会帮助看到子目录中包含的CMakeLists.txt文件,我猜它们包含add_executable和/或add_library语句来创建您的东西。
此外,由于您的示例,我猜您正在为目标使用相同的目录名称。
也就是说,您应该知道,在CMakeLists.txt文件中定义的符号在父目录中的CMakeLists.txt文件的上下文中默认不可见。因此,您应该将install语句移动到子目录中的CMakeLists.txt文件中。
如果我的想法是正确的,这应该可以解决问题。否则,我强烈建议你在你的问题中也张贴上述其他文件的内容。
无论如何,错误是很明显的。
包含用于名为X的目标的install语句的文件不包含产生该目标的目标创建语句(add_executable和其他语句),因此它继续说该目标不存在于该目录中。

jq6vz3qz

jq6vz3qz3#

这似乎仍然是CMake 3.11中的一个痛点。
在我们的代码库中,我们在子目录中定义了许多目标,并且需要创建具有不同配置和(可能重叠的)目标组合的安装程序。
我的解决方案是:

  • 在根CMakeLists.txt文件中调用add_subdirectory之前,请使用要包含在安装程序中的目标的名称创建GLOBAL属性。
  • 将目标创建函数(add_executable等) Package 在您自己的自定义函数中。在这些函数中检查目标是否存在于全局属性中,并相应地调用install

这种方法允许您集中安装程序配置。
还有:为了支持创建多个安装程序,我们在单独的.cmake文件中填充全局列表沿着其他安装程序属性。当我们调用cmake时,我们将安装程序配置CMake文件的名称作为命令行参数传递。我们的根CMakeLists.txt文件只是使用该文件调用include

smdncfj3

smdncfj34#

我认为你可以这样做:

add_subdirectory(execA)
add_subdirectory(libB)

function(install_all_targets DIR)
    get_property(TGTS DIRECTORY "${DIR}" PROPERTY BUILDSYSTEM_TARGETS)
    foreach(TGT IN LISTS TGTS)
        message(STATUS "Target: ${TGT}")
        install(TARGETS ${TGT}
                RUNTIME DESTINATION bin
                LIBRARY DESTINATION lib
                ARCHIVE DESTINATION lib)
    endforeach()

    get_property(SUBDIRS DIRECTORY "${DIR}" PROPERTY SUBDIRECTORIES)
    foreach(SUBDIR IN LISTS SUBDIRS)
    install_all_targets("${SUBDIR}")
    endforeach()
endfunction()

install_all_targets(.)

字符串

相关问题