2015-11-19 102 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