c++ - online - cmake win64 download
Diferencia entre usar Makefile y CMake para compilar el código (2)
Codifico en C / C ++ y uso un Makefile (GNU) para compilar el código. Puedo hacer lo mismo con CMake y obtener un MakeFile. Sin embargo, ¿cuál es la diferencia entre usar Makefile y CMake para compilar el código?
La afirmación de que CMake es un "generador de compilación" es un error común.
No es técnicamente incorrecto; solo describe CÓMO funciona, pero NO LO que hace.
En el contexto de la pregunta, hacen lo mismo: toman un montón de archivos C / C ++ y los convierten en binarios.
Entonces, ¿cuál es la verdadera diferencia?
-
CMake es mucho más de alto nivel. Está diseñado para compilar C ++, para el que escribe mucho menos código de compilación, pero también se puede utilizar para compilaciones de uso general.
make
tiene algunas reglas C / C ++ incorporadas, pero en su mayoría son inútiles. -
CMake
realiza una compilación de dos pasos: genera un script de compilación de bajo nivel enninja
omake
o en muchos otros generadores, y luego lo ejecuta. Todas las piezas de script de shell que normalmente se apilan enMakefile
solo se ejecutan en la etapa de generación. Por lo tanto,CMake
build puede ser de órdenes de magnitud más rápido. -
La gramática de
CMake
es mucho más fácil de soportar para herramientas externas que las de make . -
Una vez que
make
construye un artefacto, olvida cómo se construyó. ¿De qué fuentes se creó, qué indicadores del compilador?CMake
rastrea, lo deja en sus manos. Si una de las fuentes de la biblioteca se eliminó desde la versión anterior deMakefile
,make
no la reconstruirá. -
CMake
moderno (comenzando con la versión 3.algo) funciona en términos de dependencias entre "objetivos". Un destino sigue siendo un único archivo otput (lamentablemente), pero puede tener dependencias transitivas ("público" / "interfaz" en términos de CMake). Estas dependencias transitivas pueden exponerse u ocultarse de los paquetes dependientes.CMake
administrará los directorios por usted también. Conmake
, estás atascado en un nivel de archivo por archivo y de gestión de directorios a mano.
Podrías codificar algo en
make
usando archivos de bandera para cubrir los dos últimos vacíos, pero estás solo.
make
contiene un
lenguaje completo de Turing
(incluso dos, a veces tres contando
Guile
), y todos ellos son horribles.
Para ser sincero, esto es lo que
CMake
y
make
tienen en común: sus idiomas son bastante horribles:
- No tienen tipos;
- sin matrices, solo cadenas separadas por espacios, escapando así del infierno;
- normalmente pasa argumentos a funciones estableciendo variables globales; (esto se está abordando en CMake moderno: las variables pueden tener espacios de nombres ahora; un objetivo es un espacio de nombres para sus propiedades)
- la referencia a una variable indefinida se ignora silenciosamente por defecto;
para empezar.
Pero en
CMake
escribes muchas menos líneas de código.
Make (o más bien un Makefile) es un sistema de compilación: impulsa el compilador y otras herramientas de compilación para compilar su código.
CMake es un generador de sistemas de construcción. Puede producir Makefiles, puede producir archivos de compilación Ninja, puede producir proyectos KDEvelop o Xcode, puede producir soluciones de Visual Studio. Desde el mismo punto de partida, el mismo archivo CMakeLists.txt. Entonces, si tiene un proyecto independiente de la plataforma, CMake es una forma de hacerlo también independiente del sistema de compilación.
Si tiene desarrolladores de Windows acostumbrados a los desarrolladores de Visual Studio y Unix que confían en GNU Make, CMake es (una) de las opciones.
Siempre recomendaría usar CMake (u otro generador de sistema de compilación, pero CMake es mi preferencia personal) si pretende que su proyecto sea multiplataforma o ampliamente utilizable. CMake también proporciona algunas características interesantes como detección de dependencia, administración de interfaz de biblioteca o integración con CTest, CDash y CPack.
El uso de un generador de sistema de compilación hace que su proyecto esté más preparado para el futuro. Incluso si ahora es GNU-Make-only, ¿qué sucede si luego decide expandirse a otras plataformas (ya sea Windows o algo incrustado), o simplemente quiere usar un IDE?