Qt, CMake и Visual Studio Behavior - PullRequest
       16

Qt, CMake и Visual Studio Behavior

0 голосов
/ 07 февраля 2019

Я портирую некоторые из своих проектов Qt на CMake, чтобы сделать их более гибкими в разных IDE.
Единственная печальная часть с CMake, когда я генерирую VS solution, она не будет работать удивительнокак это работает с расширением Qt VS.
Например, если я изменяю файл .ui, мне нужно пересобрать проект, чтобы увидеть изменения в графическом интерфейсе по сравнению с тем, когда я использую сгенерированное расширение VSProject, он будет автоматически идентифицировать изменения и повторно перемещать класс, которому принадлежит файл .ui, без необходимости повторной сборки всего проекта.
Если я посмотрю на конфигурацию проекта, VS Extension генерирует в файле .vcxproj, он добавил бы ItemDefinitionGroup некоторые элементы следующим образом: b

И каждый класс / файл, включенный в проект, будет помечен в соответствии с типом класса (QtMoc, QtUic, QtRcc): c

Вероятно, это то, что дает Расширение Qt VS, чтобы идентифицировать, как обрабатывать каждый файл, поэтому, если оно QtUicто он проверил быизменения в файлах .ui присутствуют, и, если есть новые изменения, он перекомпилирует файл пользовательского интерфейса, затем moc класс, который принадлежит файлу .ui, и только затем повторно компилирует фактический класс, которому принадлежит.ui file.

Итак, есть ли какой-нибудь возможный способ заставить CMake сгенерировать проект, похожий на одно расширение Qt VS, сгенерированное, когда я выберу в CMake генератор VS?Я предполагаю, что CMake не поддерживает это внутренне, поскольку они стремятся абстрагировать все это поведение, чтобы сделать все проекты VS как можно более общими, независимо от того, какая среда используется, но у CMake есть флаги для поддержки Qt, например:

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

Так что я предполагаю, что это не будет большой работой для реализации.
Возможно, мой лучший выбор - раскошелиться на CMake и самому повторно реализовать это поведение?Пример psuedo:

if CMAKE_AUTOMOC == ON & CMAKE_VS_EXT == ON
    Do some custom changes to the .vcxproj file
endif

Извините за длинный пост, но любые идеи и помощь будут с благодарностью.Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2019

Поскольку это слишком много (код) для комментария, я поставил этот ответ.

AFAIK Вам не нужно включать сгенерированные файлы в ваш вызов add_executable.Это то, что функция CMake automoc делает за кулисами.

Типичная последовательность в наших CMakeLists.txt файлах выглядит следующим образом:

include_directories(${CMAKE_CURRENT_BINARY_DIR})

file(GLOB_RECURSE SOURCES sources/*.cpp)
file(GLOB_RECURSE HEADERS include/*.h)
file(GLOB_RECURSE FORMS ui/*.ui)
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
file(GLOB_RECURSE RESOURCES resources/*.qrc)

set(CMAKE_AUTOMOC TRUE)
set(CMAKE_AUTOUIC TRUE)
set(CMAKE_AUTORCC TRUE)

add_library(theLib ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES})

target_include_directories(theLib BEFORE
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include/${PROJECT_NAME}>
)
...