Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
C++ 如何使用cmake为嵌套子目录设置Visual Studio筛选器_C++_Visual Studio_Visual Studio 2012_Cmake - Fatal编程技术网

C++ 如何使用cmake为嵌套子目录设置Visual Studio筛选器

C++ 如何使用cmake为嵌套子目录设置Visual Studio筛选器,c++,visual-studio,visual-studio-2012,cmake,C++,Visual Studio,Visual Studio 2012,Cmake,我有以下结构 Main (dir) +-- CMakeLists.txt +-- File.cpp +-- File.hpp +-- Dir (dir) +-- CMakeLists.txt +-- File1.cpp +-- File1.hpp +-- File2.cpp +-- File2.hpp Main/CMakeLists.txt CMA

我有以下结构

Main (dir)
      +-- CMakeLists.txt
      +-- File.cpp
      +-- File.hpp
      +-- Dir (dir)
          +-- CMakeLists.txt
          +-- File1.cpp
          +-- File1.hpp
          +-- File2.cpp
          +-- File2.hpp
Main/CMakeLists.txt

CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB SOURCE
    "*.hpp"
    "*.cpp"
)

ADD_SUBDIRECTORY(Dir)
ADD_EXECUTABLE(Main ${SOURCE})
FILE(GLOB LOCAL_SOURCE
    "*.hpp"
    "*.cpp"
)
SET(SOURCE
    ${SOURCE}
    ${LOCAL_SOURCE}
    PARENT_SCOPE
)
Main/Dir/CmakeLists.txt

CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB SOURCE
    "*.hpp"
    "*.cpp"
)

ADD_SUBDIRECTORY(Dir)
ADD_EXECUTABLE(Main ${SOURCE})
FILE(GLOB LOCAL_SOURCE
    "*.hpp"
    "*.cpp"
)
SET(SOURCE
    ${SOURCE}
    ${LOCAL_SOURCE}
    PARENT_SCOPE
)
它在Visual Studio中生成了以下结构

我想要什么:

我的尝试:

Main/CMakeLists.txt

Main/Dir/CmakeLists.txt

我得到的:

请帮我解决这个问题

  • 我不想在主目录中使用带有筛选器的单个CmakeFile.txt
  • 实际结构是多层深嵌套结构。因此,请建议解决方案,这将适用于任何级别的子目录

有几种现成的或适应性强的解决方案可以模拟源代码树行为,如Eclipse中的CMake for Visual Studio(例如来自Zobra或Luca)

以下是我针对您的用例的简化版本:

cmake_minimum_required(VERSION 2.8.10)

project(Main CXX)

set(
    source_list
    "File.cpp"
    "File.hpp"
    "Dir/File1.cpp"
    "Dir/File1.hpp"
    "Dir/File2.cpp"
    "Dir/File2.hpp"
)

add_executable(Main ${source_list})

foreach(source IN LISTS source_list)
    get_filename_component(source_path "${source}" PATH)
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()
请参阅文档,您必须给子目录加上双反斜杠

出于我将您的
文件(GLOB…
替换为所有源文件的专用列表的原因,我想引用CMake的命令文档:

我们不建议使用
GLOB
从中收集源文件列表 您的源代码树。如果没有CMakeLists.txt文件,则在创建源时会更改 添加或删除后,生成的生成系统无法知道何时添加 让CMake再生

这是我的故障保护版本(检查绝对路径),用作函数:

function(assign_source_group)
    foreach(_source IN ITEMS ${ARGN})
        if (IS_ABSOLUTE "${_source}")
            file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
        else()
            set(_source_rel "${_source}")
        endif()
        get_filename_component(_source_path "${_source_rel}" PATH)
        string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
        source_group("${_source_path_msvc}" FILES "${_source}")
    endforeach()
endfunction(assign_source_group)
在这个例子中,你会用

assign_source_group(${source_list})

我知道使用CMAKE glob函数通常是不受欢迎的,但在我的例子中,我发现它比显式命名每个文件要好。我想我会用GLOB修改Florian的答案

# This code sorts the project files as they appear in the root directory

# Generate a list of all .c & .h files in the current directory and sub directores.
file(
     GLOB_RECURSE source_list RELATIVE
     "${CMAKE_CURRENT_SOURCE_DIR}"
     *.c *.h
    )
foreach(source IN LISTS source_list)
    get_filename_component(source_path "${source}" PATH)
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()  
message(STATUS "Tree reorganized")
自CMake起,
source\u group
命令提供了一个
参数来递归搜索源的文件路径,并构造源组以匹配文件系统结构。现在,这提供了一个更干净的解决方案:

project(Main)

set(SOURCE_LIST
    "File.cpp"
    "File.hpp"
    "Dir/File1.cpp"
    "Dir/File1.hpp"
    "Dir/File2.cpp"
    "Dir/File2.hpp"
)

add_executable(Main ${SOURCE_LIST})

# Create the source groups for source tree with root at CMAKE_CURRENT_SOURCE_DIR.
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_LIST})
我想对他的回答发表评论,但由于缺乏“声誉”,我不能

反正

source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_LIST})
工作起来很有魅力,但我还需要设置:

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

它可以正常工作,但它的过滤方式是:E:>Code>Demo>Main>file.cpp&E:>Code>Demo>Main>Dir>file1。cpp@Jai如果仍要使用
文件(GLOB…
,则需要添加
相对文件。因此,在您的
文件中(GLOB\u RECURSE source\u list RELATIVE“${CMAKE\u CURRENT\u source\u DIR}”“*.cpp”“*.hpp”)
。谢谢您,我使用您给定的CMAKE文件中的一些操作实现了我的要求。您知道将来有什么计划支持这种开箱即用的吗?@lanoxx它是VS2017的一部分。现在,您只需使用包含主
CMakeLists.txt
文件的文件夹执行
File/Open/Folder