tutorial online español descarga c++ c makefile cmake

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 en ninja o make o en muchos otros generadores, y luego lo ejecuta. Todas las piezas de script de shell que normalmente se apilan en Makefile 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 de Makefile , 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. Con make , 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?