CMake 和 VisualStudio:在解决方案资源管理器中对文件进行分组

MrK*_*ler 5 c++ cmake visual-studio cmake-gui

为了完成一个项目的长时间编码会话,我想测试我的 CPP 项目是否可以在操作系统的安排上编译。

我一直在Win10下工作。编译得很好。
我试过树莓派。编译得很好。我将我的项目的单独副本重新下载到 Win10 客户端,运行 cmake-gui,然后打开该项目:我在解决方案资源管理器中的文件夹结构全部消失了。

所以我开始挖掘,显然这个结构保存在 CMakeLists.txt 的命令中source_group。所以我开始在我的 cmake 列表中添加更多的 source_groupings,并且由于某种原因我的分组不会被接受。

例子:
source_group("game\\entitysystem" FILES ${entitysystem_SRC}) // Existing grouping source_group("game\\entitysystem\\components" FILES ${components_SRC}) // My new grouping

我的 glob 是这样的:

file(GLOB components_SRC "game/components/*.h" "game/components/*.cpp" )

file(GLOB entitysystem_SRC "game/entitysystem/*.h" "game/entitysystem/*.cpp" )

我确实相信我的 GLOB 是正确的,因为新的项目克隆编译得很好。只是 Visual Studio 的解决方案资源管理器中新结构的每个部分似乎都丢失了。是的,我已经清除了 Cmake 的缓存并重新生成了项目。不会改变它。

原始结构: 原始文件夹结构

克隆项目结构: 克隆的文件夹结构

编辑:

我确实在我的 source_group 中犯了一个错误,因为它不应该将组件放在实体系统下,但是,为什么在 Visual Studio 中没有创建任何过滤器?

Cin*_*its 4

首先,确保您正在设置set_property(GLOBAL PROPERTY USE_FOLDERS ON).

其次,不建议使用GLOB来收集源文件列表。从file(GLOB文档中:

我们不建议使用 GLOB 从源树中收集源文件列表。如果添加或删除源时 CMakeLists.txt 文件没有更改,则生成的构建系统无法知道何时要求 CMake 重新生成。

列出项目文件的推荐方法是将它们手动添加到 CMakeLists.txt。

如果您仍然想要GLOB,看起来您想要镜像源树中的目录结构。您可以在定义库或可执行文件的每个地方使用这样的宏来自动对它们进行排序:

foreach(FILE ${SRCS}) 
    # Get the directory of the source file
    get_filename_component(PARENT_DIR "${FILE}" DIRECTORY)

    # Remove common directory prefix to make the group
    string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}")

    # Make sure we are using windows slashes
    string(REPLACE "/" "\\" GROUP "${GROUP}")

    # Group into "Source Files" and "Header Files"
    if ("${FILE}" MATCHES ".*\\.cpp")
       set(GROUP "Source Files${GROUP}")
    elseif("${FILE}" MATCHES ".*\\.h")
       set(GROUP "Header Files${GROUP}")
    endif()

    source_group("${GROUP}" FILES "${FILE}")
endforeach()
Run Code Online (Sandbox Code Playgroud)