cmake:如何创建visual studio过滤器

时间:2015-11-19 15:32:28

标签: visual-studio filter cmake

我已经环顾四周(StackOverflow等),我正在尝试使用cmake生成Visual Studio过滤器。我有以下文件夹:

的src /数学
SRC /进口
src / ui

我想生成如上所述的过滤器 “数学”:包含所有的cpp& src / math中的h文件 “import”:包含所有cpp& src / import中的h文件 “ui”:包含所有cpp&在src / ui中的h文件

我尝试了几种解决方案,但似乎都没有效果!

以下是CMakeList.txt中代码的最后一个版本:

set(VD_SRC "${VisualDesigner_SOURCE_DIR}/src/visualdesigner")

file(GLOB_RECURSE SRC_UI
    "${VD_SRC}/ui/*.cpp", "${VD_SRC}/ui/*.h")
file(GLOB_RECURSE SRC_IMPORT
    "${VD_SRC}/import/*.cpp",
    "${VD_SRC}/import/*.h")

source_group("ui"            FILES ${SRC_UI})
source_group("import"        FILES ${SRC_IMPORT})

欢迎任何帮助!

5 个答案:

答案 0 :(得分:26)

请参阅How to set Visual Studio Filters for nested sub directory using cmake

请注意

  • source_group()命令仅与列出相同来源的add_library()add_executable()命令结合使用(路径必须匹配)
  • source_group()命令不会检查文件是否实际存在(因此它需要您提供的任何内容,并且在项目文件生成期间,它会尝试将给定的源组文件名与项目中使用的文件进行匹配)

我通过添加相应的add_library()目标尝试了您的代码,它按预期工作(CMake 3.3.2和VS2015):

set(VD_SRC "${VisualDesigner_SOURCE_DIR}/src/visualdesigner")

file(GLOB_RECURSE SRC_UI
    "${VD_SRC}/ui/*.cpp"
    "${VD_SRC}/ui/*.h"
)
file(GLOB_RECURSE SRC_IMPORT
    "${VD_SRC}/import/*.cpp"
    "${VD_SRC}/import/*.h"
)

add_library(VisalDesigner ${SRC_UI} ${SRC_IMPORT})

source_group("ui"            FILES ${SRC_UI})
source_group("import"        FILES ${SRC_IMPORT})

结果

Solution Explorer with Filters

以下是来自Visual Studio as an editor for CMake friendly project的更全面的版本:

set(_src_root_path "${VisualDesigner_SOURCE_DIR}/src/visualdesigner")
file(
    GLOB_RECURSE _source_list 
    LIST_DIRECTORIES false
    "${_src_root_path}/*.c*"
    "${_src_root_path}/*.h*"
)

add_library(VisualDesigner ${_source_list})

foreach(_source IN ITEMS ${_source_list})
    get_filename_component(_source_path "${_source}" PATH)
    file(RELATIVE_PATH _source_path_rel "${_src_root_path}" "${_source_path}")
    string(REPLACE "/" "\\" _group_path "${_source_path_rel}")
    source_group("${_group_path}" FILES "${_source}")
endforeach()

答案 1 :(得分:2)

我发现这样做比较容易,并认为这可能对其他人有帮助。确保您使用的是最新版本的CMAKE。

file(GLOB_RECURSE _source_list *.cpp* *.h* *.hpp*)
foreach(_source IN ITEMS ${_source_list})
    get_filename_component(_source_path "${_source}" PATH)
    string(REPLACE "${CMAKE_SOURCE_DIR}" "" _group_path "${_source_path}")
    string(REPLACE "/" "\\" _group_path "${_group_path}")
    source_group("${_group_path}" FILES "${_source}")
endforeach()

答案 2 :(得分:0)

对于那些想要在“头文件”和“源文件”下创建它们的人:

您可以使用source_group。这是一个具体的例子。

假设您的目录结构如下:

|-include
    | some.h
    |-sub
       | someother.h 
|-src
   | some.cpp
   |-sub
      |-someother.cpp

收集文件(有些人(包括文档)不鼓励使用GLOB,但我将其留给您,如果愿意,可以列出其中的一个,尽管我发现GLOB多次都可以): / p>

file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB HEADER_FILES_SUB "${CMAKE_CURRENT_SOURCE_DIR}/include/sub/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h")
file(GLOB SOURCE_FILES_SUB "${CMAKE_CURRENT_SOURCE_DIR}/src/sub/*.h")

# Setup your library or executable:
add_library(MY_LIB ${HEADER_FILES} ${HEADER_FILES_SUB}
                   ${SOURCE_FILES} ${SOURCE_FILES_SUB})

# Here's the important part ("Header Files" and "Source Files" are literals.)
source_group("Header Files\\sub" ${HEADER_FILES_SUB})
source_group("Source Files\\sub" ${SOURCE_FILES_SUB})

答案 3 :(得分:0)

从CMake 3.8开始,source_group命令提供了一个TREE参数,用于递归搜索源文件的路径,以构造源组以匹配文件系统结构。现在,解决方案更加简洁:

set(VD_SRC "${VisualDesigner_SOURCE_DIR}/src/visualdesigner")
file(GLOB_RECURSE UI_IMPORT_MATH_SRCS
    "${VD_SRC}/ui/*.cpp"
    "${VD_SRC}/ui/*.h"
    "${VD_SRC}/import/*.cpp"
    "${VD_SRC}/import/*.h"
    "${VD_SRC}/math/*.cpp"
    "${VD_SRC}/math/*.h"
)

add_library(VisualDesigner ${UI_IMPORT_MATH_SRCS})

# Create the source groups for source tree with root at VD_SRC.
source_group(TREE ${VD_SRC} FILES ${UI_IMPORT_MATH_SRCS})

此外,如果发现有用的话,请检查可以与source_group一起使用的新PREFIX参数。

免责声明:我建议不要使用GLOBsee here)。

答案 4 :(得分:0)

以上所有答案通常都能正常工作。如果您有多个库目标,并希望为每个targets创建精美的过滤器,则需要格外小心。

经过大量的猛烈抨击,我认为您应该将source_group调用保存在执行CMakeLists.txtadd_library(target ..)的同一add_executable(target ..)文件中。您可以在任何地方缓存(内部)“源\标题列表”,并在此处使用。