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
Visual studio 使CMake Visual Studio中的所有项目都依赖于一个项目_Visual Studio_Cmake - Fatal编程技术网

Visual studio 使CMake Visual Studio中的所有项目都依赖于一个项目

Visual studio 使CMake Visual Studio中的所有项目都依赖于一个项目,visual-studio,cmake,Visual Studio,Cmake,在我的项目中,我有大约250个项目,其中一个主要项目使用了大部分项目。当主项目运行时,所有项目都是最新的,这一点很重要。所以基本上,VisualStudio应该在编译(并运行)MainProject时检查所有250个项目的更改。我的CMakeLists.txt文件如下所示 Root/CMakeLists.txt .... add_subdirectory (MainProject) add_subdirectory (ProjectA) add_subdirectory (ProjectB) a

在我的项目中,我有大约250个项目,其中一个主要项目使用了大部分项目。当主项目运行时,所有项目都是最新的,这一点很重要。所以基本上,VisualStudio应该在编译(并运行)MainProject时检查所有250个项目的更改。我的CMakeLists.txt文件如下所示

Root/CMakeLists.txt

....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....
....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....
....
add_executable (ProjectA a.cpp b.cpp)
....
Root/MainProject/CMakeLists.txt

....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....
....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....
....
add_executable (ProjectA a.cpp b.cpp)
....
Root/ProjectA/CMakeLists.txt

....
add_subdirectory (MainProject)
add_subdirectory (ProjectA)
add_subdirectory (ProjectB)
add_subdirectory (ProjectC)
add_subdirectory (ProjectD)
....
....
add_executable (MainProject a.cpp b.cpp)
add_dependencies (MainProject ProjectA ProjectB ...)
....
....
add_executable (ProjectA a.cpp b.cpp)
....
显然,这是一个非常简单的例子,但希望这个想法是存在的。基本上,为了让VisualStudio检查所有250个左右项目的依赖关系,我必须将主项目中的所有其他项目添加为依赖关系。现在这根本不是一个优雅的解决方案,因为MainProject中的add_依赖项有很多依赖项。它是有效的,但是有什么比这个问题更优雅的吗?

将我的评论转化为答案

目前(根据CMake版本3.5.x),据我所知,CMake本身没有提供全局目标列表(例如作为全局属性)

编辑:现在已实现:全局属性随CMake 3.7发布

可行的解决方案

  • 在您的情况下-假设您不想修改所有250个子项目的
    CMakeLists.txt
    文件-覆盖
    add_executable()
    add_library()
    add_custom_target()
    将起到以下作用:

    cmake_minimum_required(VERSION 2.8)
    
    project(DependsAllTest)
    
    macro(add_library _target)
        _add_library(${_target} ${ARGN})
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
    endmacro()
    
    macro(add_executable _target)
        _add_executable(${_target} ${ARGN})
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
    endmacro()
    
    macro(add_custom_target _target)
        _add_custom_target(${_target} ${ARGN})
        set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
    endmacro()
    
    add_subdirectory(MainProject)
    add_subdirectory(ProjectA)
    add_subdirectory(ProjectB)
    add_subdirectory(ProjectC)
    add_subdirectory(ProjectD)
    
    get_property(_allTargets GLOBAL PROPERTY GlobalTargetList)
    message(STATUS "GlobalTargetList: ${_allTargets}")
    add_dependencies(MainProject ${_allTargets})
    
    果不其然,如果你想从头开始做这件事,我会——正如@Lindydancer所建议的那样——使用你自己版本的那些命令来允许全局定制

  • 如果您遵循的先决条件是
    MainProject
    始终是第一位的,那么您可以将其简化一点:

    cmake_minimum_required(VERSION 2.8)
    
    project(DependsAllTest2)
    
    macro(add_library _target)
        _add_library(${_target} ${ARGN})
        add_dependencies(MainProject ${_target})
    endmacro()
    
    macro(add_executable _target)
        _add_executable(${_target} ${ARGN})
        add_dependencies(MainProject ${_target})
    endmacro()
    
    macro(add_custom_target _target)
        _add_custom_target(${_target} ${ARGN})
        add_dependencies(MainProject ${_target})
    endmacro()
    
    add_subdirectory(MainProject)
    add_subdirectory(ProjectA)
    add_subdirectory(ProjectB)
    add_subdirectory(ProjectC)
    add_subdirectory(ProjectD)
    
  • 参考资料


    其他项目库是否包含在
    main项目中?还是希望所有库、可执行文件和自定义目标都链接到main?后者。我希望在MainProject运行时检查所有库、可执行文件和自定义目标(即作为依赖项链接到main)。然后请查看我的答案和可能的解决方案。在您的情况下,覆盖
    add_executable()
    add_library()
    add_custom_target()
    很可能就可以了。目前(根据CMake版本3.5.x),据我所知,CMake本身没有提供全局目标列表。啊,这是一个遗憾,但覆盖听起来足以解决我的问题。我不建议重新定义现有函数,而是定义自己的函数,比如说
    my_add_library
    ,这样就可以清楚地看到神奇的事情发生了。