考虑以下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 :(得分:11)
根据this bugreport,install(TARGETS)
命令流仅接受在同一目录中创建的目标。
因此,您需要将add_library()
调用移至顶级目录,或将install(TARGETS)
调用拆分为每个目标调用,并将每个调用移动到相应的子目录中。
答案 1 :(得分:3)
即使它有助于查看子目录中包含的CMakeLists.txt
文件,但我猜它们包含add_executable
和/或add_library
语句来创建您的内容。
此外,由于您的示例,我猜您使用的目录名称与目标相同
也就是说,您应该知道在父目录中的CMakeLists.txt
文件的上下文中,默认情况下,子目录中CMakeLists.txt
文件中定义的符号不可见。因此,您应该在子目录中的install
文件中移动CMakeLists.txt
语句。
如果我的想法是对的,这应该可以解决问题。否则,我强烈建议您在上述问题中也提及上述其他文件的内容。
无论如何,错误很明显
包含名为install
的目标的X
语句的文件不包含生成该目标的目标创建语句(add_executable
和其他语句),因此它继续说该目标中不存在该目标。
答案 2 :(得分:3)
这似乎仍然是CMake 3.11的痛点。
在我们的代码库中,我们在子目录中定义了许多目标,并且需要创建具有不同配置和(可能重叠)目标组合的各种安装程序。
这是我的解决方案:
add_subdirectory
之前,请创建一个GLOBAL
属性,其中包含要包含在安装程序中的目标的名称。add_executable
等)。在这些函数中检查目标是否存在于全局属性中,并相应地调用install
。该方法允许您集中安装程序配置。
另外:为了支持创建多个安装程序,我们在单独的.cmake文件中填充我们的全局列表以及其他安装程序属性。当我们调用cmake
时,我们将安装程序配置CMake文件的名称作为命令行参数传递。我们的根CMakeLists.txt文件只需使用该文件调用include
。
答案 3 :(得分:0)