Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
CMake子目录安装/卸载目标_Cmake - Fatal编程技术网

CMake子目录安装/卸载目标

CMake子目录安装/卸载目标,cmake,Cmake,我有一个包含两个子目录项目(添加了add_subdirectory)的项目,每个项目都有自己的库、二进制文件和安装/卸载目标。因此: main_project | |--CMakeLists.txt |--src/ |--CMakeLists.txt (with binary target, install() | |--project_a |--CMakeLists.txt |--src/ |--CMakeLists.txt (with library, inst

我有一个包含两个子目录项目(添加了add_subdirectory)的项目,每个项目都有自己的库、二进制文件和安装/卸载目标。因此:

main_project
|
|--CMakeLists.txt
|--src/
   |--CMakeLists.txt (with binary target, install()
|
|--project_a
   |--CMakeLists.txt
   |--src/
      |--CMakeLists.txt (with library, install())
|
|--project_b
   |--CMakeLists.txt
   |--src/
      |--CMakeLists.txt (with library, install())
我想让顶级项目(main_项目)自动安装库a和库b(包含在target_link_libraries()的main_项目中)。因此,我希望能够:

cd main_project/build
cmake ..
make
sudo make install
并自动安装主项目二进制库和项目a/b库。我试过这个:

main_project/src/CMakeLists.txt
...
install(FILES main project_a project_b DESTINATION bin
        LIBRARY DESTINATION lib)
但是
cmake..
会导致

install TARGETS given target "project_a" which does not exist in this directory.
正如所料

我还尝试指定路径:

main_project/src/CMakeLists.txt
...
install(FILES main ${CMAKE_SOURCE_DIR}/project_a/ ${CMAKE_SOURCE_DIR}/project_b DESTINATION bin
        LIBRARY DESTINATION lib)
它还抱怨项目a/b不在此目录中(我猜也是预期的?)

我还尝试过使用install()中的FILES选项“手动”安装库,效果很好,但考虑到子项目中有非常好的install(),这似乎非常困难

还有一个问题:由于project_a和project_b也有uninstall()自定义目标,因此我无法在没有CMake抱怨自定义目标已经存在的情况下将卸载目标添加到主_项目中。当我尝试将卸载指令添加到顶级目录列表时:

add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
但是,由于我的项目有一个卸载指令,我得到:

CMake Error at CMakeLists.txt:37 (add_custom_target):
  add_custom_target cannot create target "uninstall" because another
  target with the same name already exists.  The existing target is a
  custom target created in source directory "/main_project/project_a".
  See documentation for policy CMP0002 for more details.

那么,我如何从我的主项目旁边的子项目中安装和卸载必要的库文件呢?

我发现了这个问题。我添加了我想要安装的子目录,其中包含EXCLUDE_FROM_,这样它就不会构建子目录中的所有内容,只构建我需要的库。该标志似乎阻止子目录install()发生。也许ExternalProject_Add确实是最好的方法


另外,重新覆盖自定义目标,这对我来说很有效:

不清楚您拥有什么和想要什么。显示您尝试过的代码。编辑以包含我尝试过的代码。感谢您的帮助。由于子项目的CMakeLists.txt已经发出了
install()
命令,那么主项目就不需要再做任何关于安装它的事情了。至于“卸载”,由于子项目已经给出了目标,您不能在主项目中创建它。顺便说一句,对于3d party子项目,当您不能(或不想)更改它们的代码时,最好的方法是使用配置和构建它们。对于主项目的安装子项目,您可以使用
install(SCRIPT)
install(code)
.Hmm,当从顶级构建目录调用
makeinstall
时,在子目录(添加了
add\u subdirectory()
)中发出的每个
install()
命令都应该生效。如果你的情况不是这样,那么试着创建触发这种行为的因素。至于覆盖自定义目标,我不知道怎么做。我发现了问题。我正在添加我要安装的子目录
EXCLUDE\u FROM\u ALL
,这样它就不会构建子目录中的所有内容,只构建我需要的库。该标志似乎阻止子目录
install()
发生。也许
ExternalProject\u Add
确实是实现这一点的最佳方法。。。