Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Нужно ли добавлять .ui файлы в список исходников cmake?

#cpp #qt #qt5 #cmake #qt_designer


Нужно ли добавлять .ui файлы в список исходников cmake?

То есть писать 

add_executable(my_target main.cpp main.h main.ui)


или 

add_executable(my_target main.cpp main.h)


?
    


Ответы

Ответ 1



Как уже написали, в add_executable указывать *.ui-файлы не обязательно. При включённом set(CMAKE_AUTOUIC ON) cmake сам просмотрит все *.cpp файлы на предмет наличия в них include'ов вида ui_*.h и сам обработает соответствующие *.ui файлы. При сборке без AUTOUIC (по каким-либо причинам), .ui файл необходимо передать макросу qt5_wrap_ui(), который явно создаст команду для сборки ui_*.h, а хедер уже сам подтянется по зависимостям к исходнику, который его включает. С другой стороны это не ошибка, add_executable (и прочие) допускают указание в списке исходников файлы, которые непосредственно не участвуют в сборке; в данном случае они не добавляются в качестве зависимости к конкретной цели. Обычно мотивацией к этому является использование IDE. В этом случае проект для оной, сгенерированный cmake, будет включать их в качестве «дополнительных исходников», и они будут отображаться в списке файлов связанных с целью наряду с остальными. Также, человек, поддерживающий проект, может захотеть указать их просто «для себя», чтобы было явно видно при сборке какого файла используется конкретный ui.

Ответ 2



ui файлы не нужно перечислять в add_executable или add_library - это лишено смысла. Эти файлы обрабатываются с помощью uic, так что это он должен знать о том, где искать эти файлы (именно искать). Если ui файлы находяться в тоже директории, то все норм, а если в другой, то нужно установть опцию: set(CMAKE_AUTOUIC_SEARCH_PATHS "paht/to/uic/files")

Ответ 3



На сегодняшний день я не слышал о прямой поддержке .ui файлов в add_executable(). В этой команде перечисляются лишь исходники, которые CMake умеет "собирать" - .c,.cpp,.h,.o,.asm. Файлы .ui обрабатываются специальным макросом qt5_wrap_ui() из модуля Qt5Widgets. См. документацию.

Комментариев нет:

Отправить комментарий