CMake и VisualStudio: группировка файлов в обозревателе решений

Чтобы завершить длительную сессию кодирования проекта, я хотел проверить, можно ли компилировать мой проект CPP в соответствии с расположением ОС.

Я работал в Win10 все время. Компилирует нормально.
Я попробовал Raspberry Pi. Компилирует нормально.
Я перезагружаю отдельную копию своего проекта в клиент Win10, запускаю cmake-gui и открываю проект: моя структура папок в обозревателе решений исчезла.

Итак, я начал копаться, и, видимо, эта структура хранится в CMakeLists.txt с помощью команды source_group, Поэтому я начинаю добавлять больше source_groupings в мои списки cmake, и по какой-то причине мои группировки не будут работать.

Пример:
source_group("game\\entitysystem" FILES ${entitysystem_SRC}) // Existing grouping
source_group("game\\entitysystem\\components" FILES ${components_SRC}) // My new grouping

Мой шар был бы такой:

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 не созданы фильтры?

1

Решение

Во-первых, убедитесь, что вы устанавливаете 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()
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector