Aprendizaje CMake (1): Uso básico de CMake

https://subingwen.cn/cmake/CMake-primer/

1. Descripción general de CMake

CMake es una herramienta de creación de proyectos y es multiplataforma. Cmake y Makefile son realmente similares, pero el archivo MAKE es más bajo. La mayoría del software IDE integra make, como: nmake de VS, GNU make en Linux, qmake de Qt, etc. Si usted mismo escribe el archivo MAKE, encontrará que el archivo MAKE generalmente depende de la plataforma de compilación actual y la carga de trabajo de escribir el archivo MAKE. es relativamente grande y propenso a errores al resolver dependencias.

Y CMake solo puede resolver los problemas anteriores. Permite a los desarrolladores especificar el proceso de compilación de todo el proyecto. De acuerdo con la plataforma de compilación, el 自动生成本地化的Makefile和工程文件usuario solo necesita realizar la compilación. Por lo tanto CMake 看成一款自动生成 Makefile 的工具, el proceso de compilación es el siguiente:

inserte la descripción de la imagen aquí

  • 蓝色虚线Indica makefileel proceso de construcción de un proyecto usando
  • 红色实线Indica el proceso de cmake construcción

Primero, debe crear un CMakeLists.txtarchivo de secuencia de comandos, especificar algunas instrucciones en el archivo y luego ejecutar cmakeel comando. cmakeDespués de la ejecución, se generará un archivo. MakefileEn este momento, habrá algunas instrucciones de compilación en el archivo MAKE, y finalmente ejecutar makeel comando para ejecutar makefileuna serie de instrucciones Generar 可执行文件( 编译过程:llamar primero al preprocesador, luego al ensamblador, luego al enlazador y finalmente generar el archivo ejecutable).

cmake no solo puede generar archivos ejecutables, sino también generar archivos de biblioteca, que incluyen: bibliotecas dinámicas y bibliotecas estáticas. Después de generar estos archivos de biblioteca, se pueden importar a otros proyectos de terceros. ¿Por qué usar bibliotecas dinámicas o bibliotecas estáticas en lugar de código fuente para proyectos de terceros? Hay dos razones principales: 1. Para mantener la confidencialidad del código fuente 2. Por ejemplo, una biblioteca se compila y genera a partir de archivos fuente 100. Es muy problemático e inflado importar archivos fuente 100 en un proyecto de terceros, y no es fácil de mantener. Para mayor comodidad y facilidad de mantenimiento, estos 100 archivos fuente se compilan en archivos de biblioteca para que los llamen proyectos de terceros.

Después de presentar la función de CMake, resumamos sus funciones 优点:

  • 跨平台
  • Habilidad para gestionar grandes proyectos.
  • Simplifique el proceso de creación de compilación y el proceso de compilación
  • Extensible: puede escribir módulos de funciones específicas para cmake para expandir las funciones de cmake

2. Uso de CMake

大写、小写、混合大小写Comandos compatibles con CMake . Si la herramienta utilizada al escribir CMakeLists.txtel archivo tiene un símbolo del sistema correspondiente, entonces las mayúsculas y minúsculas se pueden usar como desee, no le preste demasiada atención.

2.1 Notas

2.1.1 Líneas de comentarios

CMake #utiliza comentarios de línea, que se pueden colocar en cualquier lugar.

# 这是一个 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.0.0)

2.1.2 Bloques de comentarios

CMake usa #[[ ]]el formulario para bloquear comentarios.

#[[ 这是一个 CMakeLists.txt 文件。
这是一个 CMakeLists.txt 文件
这是一个 CMakeLists.txt 文件]]
cmake_minimum_required(VERSION 3.0.0)

2.2 Solo archivos fuente

2.2.1 Compartir habitación

(1) Trabajo preparatorio , para facilitar la prueba, he preparado varios archivos de prueba en mi computadora local

  • add.c
#include <stdio.h>
#include "head.h"

int add(int a, int b)
{
    
    
    return a+b;
}
  • sub.c
#include <stdio.h>
#include "head.h"

// 你好
int subtract(int a, int b)
{
    
    
    return a-b;
}
  • mult.c
#include <stdio.h>
#include "head.h"

int multiply(int a, int b)
{
    
    
    return a*b;
}
  • div.c
#include <stdio.h>
#include "head.h"

double divide(int a, int b)
{
    
    
    return (double)a/b;
}
  • head.h
#ifndef _HEAD_H
#define _HEAD_H
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif

  • main.c
#include <stdio.h>
#include "head.h"

int main()
{
    
    
    int a = 20;
    int b = 12;
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", add(a, b));
    printf("a - b = %d\n", subtract(a, b));
    printf("a * b = %d\n", multiply(a, b));
    printf("a / b = %f\n", divide(a, b));
    return 0;
}

(2) La estructura de directorios de los archivos anteriores es la siguiente:

$ tree
.
├── add.c
├── div.c
├── head.h
├── main.c
├── mult.c
└── sub.c

(3) Agregar archivo CMakeLists.txt
Agregue un nuevo archivo en el directorio donde se encuentra el archivo de origen anterior CMakeLists.txt, el contenido del archivo es el siguiente:

cmake_minimum_required(VERSION 3.0)
project(CALC)
add_executable(app add.c div.c main.c mult.c sub.c)

A continuación, introduzca los tres comandos agregados en el archivo CMakeLists.txt a su vez:

  • cmake_minimum_required最低: Especifique la versión de cmake utilizada

    • Opcional, no obligatorio, si no se agrega puede haber una advertencia:
  • project: Definición 工程名称, y puede especificar la versión del proyecto, la descripción del proyecto, la dirección de la página de inicio web, los idiomas compatibles (todos los idiomas son compatibles de forma predeterminada), si no es necesario, estos pueden ignorarse, solo especifique el nombre del proyecto.

# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
       [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
       [DESCRIPTION <project-description-string>]
       [HOMEPAGE_URL <url-string>]
       [LANGUAGES <language-name>...])
  • add_executable:El proyecto de definición generará un programa ejecutable.
add_executable(可执行程序名 源文件名称)

El nombre del programa ejecutable aquí no tiene nada que ver con el nombre del proyecto en el proyecto

El nombre del archivo de origen puede ser uno o más, si hay varios espacios disponibles o intervalos ;

# 样式1
add_executable(app add.c div.c main.c mult.c sub.c)
# 样式2
add_executable(app add.c;div.c;main.c;mult.c;sub.c)

(4) Ejecute el comando CMake.
Todo está listo, pero se necesita el viento del este. Después de editar el archivo CMakeLists.txt, cmakeel comando se puede ejecutar.

# cmake 命令原型
$ cmake CMakeLists.txt文件所在路径
$ tree
.
├── add.c
├── CMakeLists.txt
├── div.c
├── head.h
├── main.c
├── mult.c
└── sub.c

0 directories, 7 files
robin@OS:~/Linux/3Day/calc$ cmake .

Después de ejecutar el comando cmake, se ejecutarán los comandos en CMakeLists.txt, así que tenga cuidado de no cometer errores al especificar la ruta para el comando cmake.

Después de ejecutar el comando, verifique si hay más archivos en el directorio donde se encuentra el archivo fuente:

$ tree -L 1
.
├── add.c
├── CMakeCache.txt         # new add file
├── CMakeFiles             # new add dir
├── cmake_install.cmake    # new add file
├── CMakeLists.txt
├── div.c
├── head.h
├── main.c
├── Makefile               # new add file
├── mult.c
└── sub.c

Podemos ver que se genera un archivo makefile en el directorio correspondiente, y luego ejecutar el comando en este momento para construir el proyecto para obtener el programa ejecutable requerido.make

$ make
Scanning dependencies of target app
[ 16%] Building C object CMakeFiles/app.dir/add.c.o
[ 33%] Building C object CMakeFiles/app.dir/div.c.o
[ 50%] Building C object CMakeFiles/app.dir/main.c.o
[ 66%] Building C object CMakeFiles/app.dir/mult.c.o
[ 83%] Building C object CMakeFiles/app.dir/sub.c.o
[100%] Linking C executable app
[100%] Built target app

# 查看可执行程序是否已经生成
$ tree -L 1
.
├── add.c
├── app					# 生成的可执行程序
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── CMakeLists.txt
├── div.c
├── head.h
├── main.c
├── Makefile
├── mult.c
└── sub.c

Finalmente, se compila la aplicación del programa ejecutable (el nombre se especifica en CMakeLists.txt).

2.2.2 Sala privada VIP

En el ejemplo anterior, se puede ver que si el comando cmake se ejecuta en el directorio donde se encuentra el archivo CMakeLists.txt, se generarán algunos directorios y archivos (incluidos los archivos MAKE). Si makeel comando Algunos archivos intermedios y un archivo ejecutable 这样会导致整个项目目录看起来很混乱no son fáciles de administrar y mantener. En este momento, podemos colocar estos archivos generados que no tienen nada que ver con el código fuente del proyecto en un directorio correspondiente Por ejemplo, nombre este directorio build:

$ mkdir build
$ cd build
$ cmake ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/robin/Linux/build

Ahora el comando cmake se buildejecuta en el directorio, pero CMakeLists.txt el archivo está 上一级en el directorio del directorio de compilación, por lo que la ruta especificada después del comando cmake ..es el directorio superior del directorio actual.

Cuando se ejecuta el comando, se generará un makefilearchivo en el directorio de compilación

$ tree build -L 1
build
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
└── Makefile

1 directory, 3 files

De esta forma, el comando make se puede ejecutar en el directorio de compilación para compilar el proyecto, y los archivos relacionados generados se almacenarán naturalmente en el directorio de compilación. 这样通过 cmake 和 make 生成的所有文件就全部和项目源文件隔离开了Cada uno volvió a cada casa, cada uno buscando a cada madre.

referencia

Autor: Su Bingyu
Enlace: https://subingwen.cn/cmake/CMake-primer/
Fuente: Dabing que ama la programación

Supongo que te gusta

Origin blog.csdn.net/weixin_38346042/article/details/130816017
Recomendado
Clasificación