2015-11-19 56 views
7

我已经看过(StackOverflow和更多),我尝试使用cmake来生成Visual Studio过滤器。即...我有以下文件夹:cmake:如何创建视觉工作室过滤器

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

,我想产生这样的公益

过滤器

“数学”:包含所有CPP在SRC /数学& .h文件

“进口”:包含所有的src /进口CPP & .h文件

“UI”:包含了所有的CPP & h文件src/ui

我试过severak解决方案,但似乎没有工作!

下面是代码的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}) 

任何帮助,欢迎!

+0

我想你想获得文件的目标?或者你对过滤器有什么意义?这是Visual Studio特定的东西吗? – usr1234567

+0

是的,Visual Studio在“解决方案”中有某种“文件夹”,他们称之为“过滤器”。它允许组织所有文件,如VS中的文件夹! –

回答

12

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

要知道,

  • source_group()命令仅在联合工作与add_library()add_executable()命令列出同一来源(该路径必须匹配)
  • 的​​命令不检查文件是否真的存在(所以它需要你给它的任何东西,并且在项目文件生成期间它会尝试将给定的源组文件名与项目中使用的文件相匹配)

我给你的代码尝试通过添加相应的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() 
+0

它是完美的。谢谢 –

+0

谢谢,非常有用! – user1754322