qt - ¿Cuáles son las diferencias y similitudes entre CMake y qmake?
(4)
Ambos son sistemas de compilación, pero no son muy similares en absoluto. Si su proyecto usa Qt, probablemente sea mejor que use qmake. CMake es más genérico y se adapta a casi cualquier tipo de proyecto.
Tanto qmake como CMake generan un Makefile , que es leído por make
para construir el proyecto. No todos los sistemas de compilación generan un Makefile, pero muchos sí lo hacen. Incluso un Makefile es un tipo de sistema de compilación; le dice al compilador y al enlazador qué hacer para crear un ejecutable (o una biblioteca dinámica o estática).
Si su proyecto usa Qt, pero no desea usar qmake, tendrá que hacer algunas cosas más usted mismo:
- ejecutando el compilador Meta Object (MOC)
- include paths (dile al compilador dónde buscar los encabezados de Qt)
- vincular (indicar al vinculador dónde buscar las bibliotecas Qt)
Por lo tanto, tendrás que trabajar un poco más para construir un proyecto de Qt sin qmake, pero es posible y te enseñará mucho sobre cómo Qt y q pueden hacer las cosas.
En una nota personal (tome esto solo como una recomendación, investigue más a fondo): no soy un gran admirador de qmake. Te ayuda con las cosas de Qt, pero aparte de eso, creo que es bastante limitado.
En cualquier caso, recomendaría aprender a construir un proyecto pequeño (~ 10 archivos fuente) sin usar ningún tipo de sistema de compilación. No utiliza CMake, no con un archivo Makefile, solo usa el compilador y el enlazador directamente. En realidad, no debe construir ningún proyecto real de esta manera, pero debe aprender a hacerlo, solo para saber qué hacen realmente los sistemas de construcción. Saber lo que hacen los hará mucho más fáciles de usar.
Hace unos meses, cambiamos un proyecto de qmake a Premake , que también vale la pena ver. Es altamente programable (con Lua), que es genial cuando necesitas personalizar tu proceso de compilación.
Dicho esto, es un poco más "manual", así que prepárese para aprender cómo funciona la compilación y la vinculación en un nivel más básico, sin el uso de un sistema de compilación. También está en beta (Premake 5), por lo que aún faltan algunas partes y piezas.
También puedes echarle un vistazo a qbs , que se supone que es un mejor qmake. Todavía está en una etapa beta, así que esperaría mientras madura y se vuelve más fácil de usar.
Me gustaría saber las razones para usar CMake para un proyecto particular sobre qmake y viceversa .
Simplemente, ¿cuáles son los pros y los contras de ambos sistemas de construcción? Busqué y encontré pocos documentos pero me siento difícil de entender.
CMake es, con mucho, el sistema de compilación más potente. La sintaxis es "no tan agradable" para decirlo suavemente. Pero luego, para cualquier proyecto complejo, lo que uno tiene que ver con QMake (o cualquier sistema de compilación que conozco) para lograr cosas tampoco es agradable. Para proyectos simples, QMake es más agradable de ver.
Si necesita configurar comprobaciones para dependencias de terceros que no sean Qt, CMake es lo que desea, el soporte para las comprobaciones de configuración en QMake es mínimo o inexistente.
Por otro lado, QMake funciona muy bien con Qt Creator (el soporte de CMake está ausente, aunque es factible usar CMake con Creator).
Si desea compilar e implementar para iOS y Android desde Qt Creator, recomiendo QMake. (No estoy seguro de si es posible estos días con CMake, sin duda causará más dolores de cabeza).
Uso CMake para mis proyectos de Qt y estoy muy contento con él. Específicamente, tengo lo siguiente en mi 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
)
Espero que esto ayude si decides ir con CMake.
CMake
lo ayudará a generar archivos de configuración para muchos sistemas de compilación (un "sistema de compilación" se denomina Generadores en CMake
). Vea ¿Qué es un generador CMake? .
Significa que si tienes un conjunto de fuentes C / C ++ y un CMakeLists.txt
bien escrito, puedes usar CMake para crear proyectos para diferentes sistemas de compilación (IDE basado en línea de comandos) como Visual Studio, CodeBlocks, g ++ ... . Con CMake, puede elegir el IDE y el compilador que usará al final y cambiar "fácilmente" entre los compatibles.
qmake
, por lo que sé, solo admitirá QtCreator como un IDE (itleft utilizando un compilador de terceros en segundo plano: nmake de Visual Studio, g ++, MinGW ...). Pero no generará una solución de Visual Studio (archivo sln) utilizando qmake
. Esa es la principal limitación que veo en qmake (porque odio QtCreator ... Visual Studio es mucho más potente e intuitivo ... pero esa es solo mi opinión).
Es cierto qmake
hace que sea más fácil compilar aplicaciones basadas en Qt (porque MOC, .ui y gusto por Qt son compatibles de forma nativa) que CMake
. Pero de todos modos es factible usar CMake
(hay funciones incorporadas para la integración de Qt). Solo su CMakeLists.txt puede tener que volverse a trabajar un poco cuando se mueva a nuevas versiones de Qt (tuve dificultades al pasar de Qt4 a Qt5, supongo que usar qmake
hace más fácil).
Personalmente, uso CMake
para mi entorno de compilación y, cuando necesito usar QtCreator (principalmente para la implementación de Android), hago que mis scripts de CMake
generen un archivo .pro para qmake / QtCreator. Funciona bien porque la sintaxis del archivo qmake
.pro es realmente simple. Entonces no estoy bloqueado a un IDE específico.