首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmake:如何创建visual studio过滤器

cmake:如何创建visual studio过滤器
EN

Stack Overflow用户
提问于 2015-11-19 15:32:28
回答 5查看 24.6K关注 0票数 27

我已经看过了(StackOverflow等等),我正在尝试使用cmake来生成Visual过滤器。我有以下文件夹:

代码语言:javascript
复制
src/math  
src/import  
src/ui  

我想生成像上面那样的过滤器。

math:包含src/数学中的所有cpp &h文件。

import:包含src/import中的所有cpp &h文件

ui:包含src/ui中的所有cpp &h文件

我已经尝试过几种解决方案,但似乎没有一种可行!

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

代码语言:javascript
复制
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})

欢迎任何帮助!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-11-19 19:53:18

请参阅如何使用cmake为嵌套子目录设置Visual过滤器

只是要注意

  • source_group()命令仅与列出相同源的add_library()add_executable()命令结合使用(路径必须匹配)
  • source_group()命令不检查该文件是否实际存在(因此它获取您给它的任何内容,并且在生成项目文件时,它试图将给定的源组文件名与项目中使用的文件匹配)

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

代码语言:javascript
复制
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})

结果在

下面是从Visual作为CMake友好项目的编辑器摘录的一个更通用的版本

代码语言:javascript
复制
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()
票数 37
EN

Stack Overflow用户

发布于 2019-02-05 09:48:04

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

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2019-06-07 14:33:54

在CMake 3.8中,source_group命令提供了一个TREE参数,用于递归搜索源的文件路径,以构造与文件系统结构相匹配的源组。现在,解决方案要干净得多,不需要循环:

代码语言:javascript
复制
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})

此外,如果发现新的PREFIX参数有用,可以在source_group中使用这个参数。

免责声明:我建议尽可能不要使用GLOB (请看这里)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33808087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档