Чтобы завершить длительную сессию кодирования проекта, я хотел проверить, можно ли компилировать мой проект 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 не созданы фильтры?
Во-первых, убедитесь, что вы устанавливаете 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()
Других решений пока нет …