web-dev-qa-db-fra.com

Quelles sont les différences et similitudes entre CMake et qmake?

Je voudrais savoir raisons pour lesquelles CMake est utilisé pour un projet particulier sur qmake et vice versa.

Quels sont simplement les avantages et les inconvénients des deux systèmes de construction? J'ai cherché et trouvé peu de documents mais je me sens difficile à comprendre.

31
Hareen Laks

Les deux sont des systèmes de construction, mais ils ne sont pas du tout très similaires. Si votre projet utilise Qt, vous feriez probablement mieux d'utiliser qmake. CMake est plus générique et s'adapte à peu près à tout type de projet.

Qmake et CMake génèrent un Makefile , qui est lu par make pour construire le projet. Tous les systèmes de génération ne génèrent pas de Makefile, mais beaucoup le font. Même un Makefile est un type de système de construction; il indique au compilateur et à l'éditeur de liens quoi faire, afin de créer un exécutable (ou une bibliothèque dynamique ou statique).


Si votre projet utilise Qt, mais que vous ne voulez pas utiliser qmake, vous devrez faire quelques autres choses vous-même:

  • exécution du Meta Object Compiler (MOC)
  • inclure les chemins (indiquer au compilateur où chercher les en-têtes Qt)
  • liaison (dire à l'éditeur de liens où chercher les bibliothèques Qt)

Donc, vous devrez faire un peu plus de travail pour construire un projet Qt sans qmake, mais c'est possible et cela vous apprendra beaucoup sur la façon dont Qt et qmake font les choses.

Sur une note personnelle (prenez cela uniquement comme une recommandation, faites des recherches supplémentaires vous-même): Je ne suis pas un grand fan de qmake. Cela vous aide avec les trucs Qt, mais à part cela, je l'ai trouvé assez limité.


Dans tous les cas, je recommanderais d'apprendre à construire un petit projet (~ 10 fichiers source) sans utiliser aucun type de système de construction. N'utilisez pas CMake, pas avec un Makefile, utilisez simplement le compilateur et l'éditeur de liens directement. Vous ne devriez pas réellement construire un vrai projet de cette façon, mais vous devriez apprendre à le faire, juste pour apprendre ce que les systèmes de construction font réellement. Savoir ce qu'ils font les rendra beaucoup plus faciles à utiliser.


Il y a quelques mois, nous avons changé un projet de qmake en Premake , qui vaut également le coup d'œil. Il est hautement scriptable (avec Lua), ce qui est idéal lorsque vous devez personnaliser votre processus de construction.

Cela dit, c'est un peu plus "manuel", alors préparez-vous à apprendre comment la compilation et la liaison fonctionnent à un niveau plus basique, sans utiliser de système de construction. Il est également en version bêta (Premake 5), il manque donc encore quelques morceaux.

Vous pouvez également jeter un œil à qbs , qui est censé être un meilleur qmake. Il est encore en phase bêta, alors j'attendrais qu'il mûrisse et devienne plus facile à utiliser.

30
Humpparitari

CMake est de loin le système de build le plus puissant. La syntaxe est "pas si gentille" pour le moins. Mais alors, pour tout projet complexe, ce que l'on a à faire avec QMake (ou tout système de construction que je connais) pour réaliser les choses n'est pas non plus agréable. Pour les projets simples, QMake est plus agréable à regarder.

Si vous avez besoin de configurer les vérifications pour les dépendances tierces autres que Qt, CMake est ce que vous voulez, la prise en charge des configurations de vérification dans QMake est minimale ou inexistante.

QMake d'autre part fonctionne très bien avec Qt Creator (le support CMake là-dedans fait défaut, bien qu'il soit possible d'utiliser CMake avec Creator).

Si vous voulez construire et déployer pour iOS et Android depuis Qt Creator, je suggère fortement QMake. (Je ne suis pas sûr que ce soit encore possible de nos jours avec CMake - ce sera certainement beaucoup plus) mal de tête).

19
Frank Osterfeld

J'utilise CMake pour mes projets Qt et j'en suis très content. Plus précisément, j'ai les éléments suivants dans mon 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  
)

J'espère que cela vous aidera si vous décidez d'aller avec CMake.

11
Mr Squid

CMake vous aidera à générer des fichiers de configuration pour de nombreux systèmes de build (un "système de build" est appelé Generators dans CMake). Voir Qu'est-ce qu'un générateur CMake? .

Cela signifie que si vous avez un ensemble de sources C/C++ et un CMakeLists.txt Bien écrit, vous pouvez utiliser CMake pour créer des projets pour différents systèmes de construction (IDE basé sur la ligne de commande) comme Visual Studio, CodeBlocks, g ++ ... Avec CMake, vous pouvez choisir le IDE et le compilateur que vous utiliserez à la fin et basculer "facilement" entre ceux pris en charge.

qmake, pour autant que je sache, ne supportera que QtCreator en tant que IDE (itleft utilisant un compilateur tiers en arrière-plan: nmake de Visual Studio, g ++, MinGW ... Mais vous ne générerez pas de solution Visual Studio (fichier sln) en utilisant qmake. C'est la principale limitation que je vois dans qmake (parce que je déteste QtCreator ... Visual Studio est beaucoup plus puissant et intuitif .. .Mais c'est juste mon opinion).

Il est vrai que qmake facilite la compilation d'applications basées sur Qt (car MOC, .ui et le fait d'aimer Qt sont pris en charge en natif) que CMake. Mais c'est quand même faisable en utilisant CMake (il y a des fonctions intégrées pour l'intégration de Qt). Seul votre CMakeLists.txt devra peut-être être retravaillé un peu lors du passage aux nouvelles versions de Qt (j'ai eu du mal à passer de Qt4 à Qt5, je suppose que l'utilisation de qmake rend cela plus facile).

Personnellement, j'utilise CMake pour mon environnement de construction et, lorsque j'ai besoin d'utiliser QtCreator (pour Android principalement), je fais générer par mes scripts CMake un Fichier .pro pour qmake/QtCreator. Il fonctionne bien car la syntaxe du fichier qmake .pro est très simple. Je ne suis donc pas verrouillé sur un IDE spécifique.

7
jpo38

qmake

  • Se concentre sur les projets utilisant Qt
  • Le fichier de projet est facilement généré par QtCreator (bon pour les débutants)
  • Pris en charge par QtCreator

CMake

  • Est utilisé dans un large éventail de projets
  • Prend en charge de nombreuses plates-formes et langues
  • Pris en charge par plusieurs IDE: par exemple QtCreator, Visual Studio
  • Génère une description de projet pour plusieurs IDE
  • Contient des commandes pour faciliter l'utilisation de Qt (le plus important: automoc)

Ma recommandation: utilisez qmake au cas où QtCreator est votre IDE et vous commencez avec Qt ou C++. Utilisez cmake au cas où vous voudriez faire des choses complexes dans votre build.

Qmake et CMake fonctionnent de façon similaire. Voir http://www.th-thielemann.de/development/cmake/cmake_qmake_to_cmake.html pour un tutoriel pour migrer de qmake vers CMake.

5
Th. Thielemann