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:避免头文件和源文件Visual Studio筛选器,并将cpp和h文件放在解决方案根目录中_Cmake - Fatal编程技术网

CMake:避免头文件和源文件Visual Studio筛选器,并将cpp和h文件放在解决方案根目录中

CMake:避免头文件和源文件Visual Studio筛选器,并将cpp和h文件放在解决方案根目录中,cmake,Cmake,有人知道如何在没有vs过滤器的情况下将源文件和头文件放在解决方案根目录上吗?我将所有的源子文件夹很好地分类到vs过滤器中,但是源根目录中的文件将变成“头文件”和“源文件” 谢谢。您可以使用空字符串来实现此目的: source_group("" FILES ${MY_TOP_LEVEL_SOURCES} ${MY_TOP_LEVEL_HEADERS}) 另一个答案对我来说是不够的,因为它使所有文件系统层次结构变得平坦。我不知道其他简单的解决方案,所以我只是递归所有层次结构,并相应地创建过滤器。这

有人知道如何在没有vs过滤器的情况下将源文件和头文件放在解决方案根目录上吗?我将所有的源子文件夹很好地分类到vs过滤器中,但是源根目录中的文件将变成“头文件”和“源文件”


谢谢。

您可以使用空字符串来实现此目的:

source_group("" FILES ${MY_TOP_LEVEL_SOURCES} ${MY_TOP_LEVEL_HEADERS})

另一个答案对我来说是不够的,因为它使所有文件系统层次结构变得平坦。我不知道其他简单的解决方案,所以我只是递归所有层次结构,并相应地创建过滤器。这样,过滤器就相当于文件系统视图:

# EXCLUDE_CURRENT to exclude source in the current directory
function(glob_source sources curdir)
    glob_source_recurse(sources ${curdir} "" ${ARGN})
    # Need to set sources in the parent scope https://stackoverflow.com/a/50953059/213871
    set(${sources} ${${sources}} ${SOURCE_FILES} PARENT_SCOPE)
endfunction()

macro(glob_source_recurse sources curdir prefix)
    subdirlist(subdirs ${curdir})
    foreach(subdir ${subdirs})
        if ("${prefix}" STREQUAL "")
            glob_source_recurse(sources "${curdir}/${subdir}" "${subdir}")
        else()
            glob_source_recurse(sources "${curdir}/${subdir}" "${prefix}/${subdir}")
        endif()
    endforeach()

    set (extra_macro_args ${ARGN})
    if (NOT extra_macro_args STREQUAL "EXCLUDE_CURRENT")
        file(GLOB SOURCE_FILES "${curdir}/*.cpp" "${curdir}/*.h" "${curdir}/*.hpp")
        source_group("${prefix}" FILES ${SOURCE_FILES})
        list(APPEND sources ${SOURCE_FILES})
    endif()
endmacro()
它可用于:

glob_source(SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR})

您可以根据需要进行编辑。

不适合我。但是,
(筛选器组名称的单个空格)似乎有效。空字符串名称似乎仅适用于文件,而不适用于正则表达式(CMake 3.5.2)。在解析VCPROJ XML时,过滤器名称中的单个空间会使VisualC++ 2008出错。