[Sistema operativo Linux] Compile automáticamente make y Makefile

inserte la descripción de la imagen aquí

1. Introducción a make/makefile

1. ¿Qué es make, makefile?

makees una herramienta/comando para construir proyectos C++ ; es un archivomakefile de script que contiene comandos de compilación . Interprete los comandos en el archivo MAKE a través de la herramienta make para compilar nuestro proyecto.

2. ¿Por qué existe un make/makefile?

Desarrollado bajo el ambiente Linux, cuando hay pocos archivos fuente del proyecto, gcc se puede usar para compilar directamente; pero cuando hay muchos archivos fuente del proyecto, la compilación directa de gcc es complicada (por ejemplo, hay muchos comandos, el orden de compilación del archivo se determina, etc.) y no es fácil para proyectos posteriores. Por lo tanto, usar make/makefile para lograr la compilación automática es beneficioso para el desarrollo del proyecto.

2. Reglas de archivos MAKE

1. Reglas básicas

target:prerequisites
 	command

Reglas básicas de escritura de archivos Makefile:

Al igual que hacer un buen plato, necesita los ingredientes de los que depende, ¡y debe confiar en las buenas habilidades culinarias del chef!

imagen-20230107180844759

  1. Destino: destino, el archivo de destino que se generará suele ser el archivo intermedio o el archivo final del programa, como test.i, test.s, test.o, test
  2. Dependencia: requisitos previos, de qué archivos se genera el archivo de destino, a menudo uno o más
  3. Comando: comando, al ejecutar este comando para obtener el archivo de destino del archivo dependiente, debe tenerse en cuenta que debe haber uno antes del [tab键]comando, y puede haber varios comandos, ¡pero cada comando debe estar en una sola línea!

En el archivo MAKE, [tab键]no se puede omitir, y no se puede reemplazar por espacios. [tecla de tabulación] no es igual a 4 espacios u 8 espacios. Una tecla de tabulación en realidad tiene 4 caracteres, pero representa 4 caracteres.

2. Da un ejemplo

El Makefile es el siguiente:

PD:

  • El nombre del archivo makefile también se puede llamar:Makefile
  • Los comentarios en el archivo makefile usan " #"
test:test.c          #依赖关系
  gcc test.c -o test #依赖方法  
.PHONY:clean    
clean:    
  rm -rf test 
  • ¿Qué es este .PHOINY? Hablaré de eso más tarde.

:wq!¿Cómo usamos el archivo MAKE después de salir de vim?

imagen-20230107182534247

3. Objetivo falso

Antes de introducir objetivos falsos, hablemos del concepto de objetivos reales:

  • Objetivo real: el objetivo real es el nombre del archivo que se generará después de testejecutar el comando

  • Pseudo-objetivo: el archivo real no se generará después de que se ejecute el comando. A menudo se usa para operaciones auxiliares. .PHONY es la etiqueta del pseudo-objetivo. Es cleanun pseudo-objetivo y no generará un archivo con el nombre real. limpio.

    Características de los pseudo-objetivos: los pseudo-objetivos siempre se pueden ejecutar [por qué más adelante]

imagen-20230107183755900

4. Otras Reglas

nombre de la variable sentido
$@ Archivo de destino, que puede representar la prueba
$^ Todos los archivos dependientes pueden representar test.c
$< primer archivo de dependencia
test:test.c    
  @gcc $^ -o $@                                                                                                              
.PHONY:clean    
clean:    
  @rm -rf test

@: al ejecutar make sin @ en la línea de comando, el comando ejecutado se repetirá en el terminal y @ no se repetirá

imagen-20230107184851539

¿Por qué cuando se ejecuta la línea de comandos, el comando para ejecutar el primer conjunto de dependencias y métodos dependientes es make, pero el comando para ejecutar el segundo conjunto de dependencias y métodos dependientes es make clean?

De hecho, primero usamos por defecto el primer conjunto de dependencias y los métodos dependientes también se pueden escribir completamente: hacer prueba

Es solo que estipulamos que el primer grupo puede omitir test y solo escribir make

3. Tres problemas de tiempo para los archivos: hacer un programa

1. ¿Cuándo se actualizarán los tres tiempos?

Sabemos: archivo = contenido del archivo + atributos del archivo

Puede ver el estado del archivo por estadística + nombre de archivo:

[li@VM-8-5-centos 1-7]$ stat test.c
  File: ‘test.c’
  Size: 74        	Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d	Inode: 924282      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1002/      li)   Gid: ( 1002/      li)
Access: 2023-01-07 18:48:21.189648157 +0800
Modify: 2023-01-07 18:48:17.476581743 +0800
Change: 2023-01-07 18:48:17.476581743 +0800
 Birth: -
hora sentido
Acceso (tiempo de acceso al archivo) Cambia al leer el archivo, como cat/less, pero ls no actualizará la hora al ver el archivo.
Modificar (hora de modificación del archivo) Cambia cuando se edita el contenido del archivo, como vim/touch
Cambio (hora de modificación del atributo) Cambia cuando se modifica el atributo del archivo, como mv/chmod, etc.
  • Debido a que se debe acceder al archivo para completar la modificación del contenido del archivo, entonces Modificar actualizaciones, Acceso también debe actualizar

  • Debido a que el contenido del archivo se modifica, el tamaño del archivo debe cambiar, por lo que la actualización Modificar, Cambiar también debe actualizarse

  • Pero el cambio de Acceso/Cambiar no hará que cambien los otros dos tiempos

imagen-20230107212156116

Revise los atributos del archivo:

Los atributos de un archivo o directorio de Linux incluyen principalmente : el nodo, tipo, modo de permiso, número de enlaces, usuario y grupo de usuarios al que pertenece el archivo o directorio, la hora del último acceso o modificación, etc. del archivo o directorio.

-rw-rw-r-- 1 li li   62 Jan  7 18:47 Makefile
-rwxrwxr-x 1 li li 8360 Jan  7 20:55 test
-rw-rw-r-- 1 li li   74 Jan  7 18:48 test.c

2. Dos funciones de toque

Sabemos que el comando táctil puede crear un archivo, y otra función es actualizar las tres horas del archivo existente como la hora del sistema.

touch test//不带选项,atime,mtime,ctime都更新
touch test -a//atime更新
touch test -m//mtime更新
touch test -c//ctime更新

3. ¿Cómo sabe el programa make si los archivos dependientes están actualizados?

Primero debe haber test.c y luego el archivo de prueba, lo que significa que, al principio, la hora de modificación de test.c debe ser anterior a la hora de modificación de test.

Si el programa make encuentra que la hora de la última modificación de la prueba es más antigua que la hora de la última modificación de la prueba.c, significa que la prueba.c debe haberse modificado después de la última modificación de la prueba, por lo que al hacer, el método dependiente puede ser ejecutado Éxito, y viceversa!

imagen-20230107211837209

Aquí también podemos explicar por qué .PHONYhay una característica: el modificado por .PHONY siempre se puede ejecutar, es decir, después de la modificación de .PHONY, ya no es necesario juzgar si se debe volver a compilar comparando el tiempo de modificación de prueba y prueba.c!

Supongo que te gusta

Origin blog.csdn.net/qq_64428099/article/details/128593345
Recomendado
Clasificación