Men*_*des 20 c++ makefile cmake
考虑以下CMakeLists.txt文件:
add_subdirectory(execA)
add_subdirectory(libB)
install(TARGETS execA libB
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
install TARGETS given target "execA" which does not exist in this
directory
Run Code Online (Sandbox Code Playgroud)
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 ..
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
尽管它有助于查看CMakeLists.txt子目录中包含的文件,但我猜它们包含add_executable和/或add_library语句来创建您的内容。
另外,由于您的示例,我猜您对目标使用了与目录相同的名称。
也就是说,您应该知道CMakeLists.txt在子目录中的文件中定义的符号默认情况下在CMakeLists.txt父目录中的文件上下文中是不可见的。因此,您应该在子目录中install的CMakeLists.txt文件中移动您的语句。
如果我的想法是正确的,这应该可以解决问题。否则,我强烈建议您在问题中也发布上述其他文件的内容。
无论如何,错误很明显。
包含指定install目标语句的文件X不包含产生该目标的目标创建语句(add_executable和其他语句),因此它继续说该目标不存在于该目录中。
这似乎仍然是 CMake 3.11 中的一个痛点。
在我们的代码库中,我们在子目录中定义了许多目标,需要创建各种具有不同配置和(可能重叠)目标组合的安装程序。
这是我的解决方案:
add_subdirectory根 CMakeLists.txt 文件之前,GLOBAL使用要包含在安装程序中的目标名称创建一个属性。add_executable等)包装在您自己的自定义函数中。在这些函数中检查目标是否存在于全局属性中,并相应地调用install。这种方法允许您集中安装程序配置。
另外:为了支持创建多个安装程序,我们在单独的 .cmake 文件中填充我们的全局列表以及其他安装程序属性。当我们调用 时cmake,我们将安装程序配置 CMake 文件的名称作为命令行参数传递。我们的根 CMakeLists.txt 文件只是调用include该文件。