Каковы различия и сходства между CMake и qmake?
Я хотел бы узнать причины использования CMake для конкретного проекта над qmake и наоборот.
Просто какие плюсы и минусы обеих систем сборки? Я искал и нашел несколько документов, но мне трудно понять.
Ответы
Ответ 1
Оба являются системами сборки, но они совсем не похожи. Если ваш проект использует Qt, вам, вероятно, лучше всего использовать qmake. CMake более общий и подходит практически для любого типа проекта.
Оба qmake и CMake генерируют Makefile, который читается make
для создания проекта. Не все системы сборки генерируют Makefile, но многие это делают. Даже Makefile - это тип системы сборки; он сообщает компилятору и компоновщику, что делать, чтобы создать исполняемый файл (или динамическую или статическую библиотеку).
Если ваш проект использует Qt, но вы не хотите использовать qmake, вам придется сделать еще несколько вещей:
- работает Компилятор метаобъектов (MOC)
- включить пути (указать компилятору, где искать заголовки Qt)
- ссылка (сообщите компоновщику, где искать библиотеки Qt)
Итак, вам придется немного поработать над созданием Qt-проекта без qmake, но это возможно, и это научит вас многому о том, как Qt и qmake делают что-то.
В личной заметке (возьмите это только как рекомендацию, сделайте дальнейшее исследование самостоятельно): Я не большой поклонник qmake. Это помогает вам с материалом Qt, но, кроме этого, я нашел его довольно ограниченным.
В любом случае я бы рекомендовал научиться строить небольшой проект (~ 10 исходных файлов) без использования какой-либо системы сборки. Не использовать CMake, а не с Makefile, просто используя компилятор и компоновщик напрямую. Вы не должны фактически создавать какой-либо реальный проект таким образом, но вы должны научиться этому, просто чтобы узнать, что на самом деле делают системы сборки. Знание того, что они делают, сделает их намного проще в использовании.
Несколько месяцев назад мы переключили проект с qmake на Premake, что также стоит посмотреть. Он очень доступен для сценариев (с Lua), что отлично, когда вам нужно настроить процесс сборки.
Тем не менее, это немного более "ручной", поэтому подготовьтесь, чтобы узнать, как компиляция и компоновка работают на более базовом уровне, без использования системы сборки. Это также в бета-версии (Premake 5), поэтому некоторые фрагменты и фрагменты все еще отсутствуют.
Вы также можете взглянуть на qbs, который должен быть лучшим qmake. Он все еще находится на стадии бета-тестирования, поэтому я буду ждать, пока он созреет и станет проще в использовании.
Ответ 2
CMake - это, безусловно, более мощная система сборки. Синтаксис "не так хорош", мягко говоря. Но тогда, для любого сложного проекта, то, что нужно делать с QMake (или любой сборкой, которую я знаю) для достижения чего-либо, тоже не приятно. Для простых проектов QMake лучше смотреть на них.
Если вам нужны проверки конфигурации сторонних зависимостей, отличных от Qt, CMake - это то, что вы хотите, поддержка проверок конфигурации в QMake минимальна и не существует.
QMake, с другой стороны, отлично работает с Qt Creator (поддержка CMake там отсутствует, хотя можно использовать CMake с Creator).
Если вы хотите создавать и развертывать iOS и Android из Qt Creator, я настоятельно рекомендую QMake. (Не уверен, возможно ли это в наши дни с CMake - это, безусловно, вызовет гораздо большую головную боль).
Ответ 3
CMake
поможет вам создавать файлы конфигурации для многих систем сборки ( "система сборки" называется генераторами в CMake
). См. Что такое генератор CMake?.
Это означает, что если у вас есть набор источников C/С++ и хорошо написанный CMakeLists.txt
, вы можете использовать CMake для создания проектов для разных систем сборки (IDE на основе командной строки), таких как Visual Studio, CodeBlocks, г ++...
С помощью CMake вы можете выбрать IDE и компилятор, который вы будете использовать в конце и "легко" между поддерживаемыми.
qmake
, насколько мне известно, поддерживает QtCreator только как IDE (он использует сторонний компилятор в фоновом режиме: nmake из Visual Studio, g++, MinGW...). Но вы не будете генерировать решение Visual Studio (sln файл) с помощью qmake
. Это главное ограничение, которое я вижу в qmake (потому что я ненавижу QtCreator... Visual Studio более мощная и интуитивно понятная... но это только мое мнение).
Это true qmake
упрощает компиляцию приложений на основе Qt (потому что MOC,.ui и симпатия к Qt поддерживается на основе), чем CMake
. Но все равно можно использовать CMake
(там встроены функции для интеграции Qt). Только ваш CMakeLists.txt, возможно, придется немного переработать при переходе на новые выпуски Qt (мне было тяжело переходить с Qt4 на Qt5, я полагаю, что использование qmake
делает это проще).
Personnaly, я использую CMake
для моей среды сборки, и когда мне нужно использовать QtCreator (для развертывания Android в основном), я создаю сценарии CMake
для создания файла .pro для qmake/QtCreator. Это хорошо работает, потому что синтаксис qmake
.pro действительно прост. Затем я не привязан к определенной среде IDE.
Ответ 4
Я использую CMake для своих проектов Qt и очень доволен этим. В частности, у меня есть следующее в моем CMakeLists.txt:
set(QT_VERSION_REQ "5.2")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5Core ${QT_VERSION_REQ} REQUIRED)
find_package(Qt5Quick ${QT_VERSION_REQ} REQUIRED)
find_package(Qt5Widgets ${QT_VERSION_REQ} REQUIRED)
find_package(Qt5Gui ${QT_VERSION_REQ} REQUIRED)
set(CMAKE_AUTOMOC ON)
QT5_WRAP_UI( UI_HDRS ${UI_FILES} )
ADD_EXECUTABLE(${MOC_HEADERS})
target_link_libraries(${PROJECT_NAME}
Qt5::Core
Qt5::Quick
Qt5::Widgets
Qt5::Gui
)
Надеюсь, это поможет, если вы решите пойти с CMake.