5

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

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

所以我开始四处挖掘,显然这个结构用 command 保存在 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 中没有创建任何过滤器?

4

1 回答 1

3

首先,确保您正在设置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()
于 2016-12-10T23:22:54.143 回答