Directorio de artículos
1. Introducción a make/makefile
1. ¿Qué es make, makefile?
make
es 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!
- 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
- Dependencia: requisitos previos, de qué archivos se genera el archivo de destino, a menudo uno o más
- 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?
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
test
ejecutar el comandoPseudo-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
clean
un 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]
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á
¿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
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!
Aquí también podemos explicar por qué .PHONY
hay 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!