Makefile (requerido para la entrevista)

1.M Makefile introducción básica

1 .1 Introducción a Makefile

make es un administrador de proyectos, puede detectar espontáneamente archivos actualizados de acuerdo con el tiempo del archivo para reducir la cantidad de compilación. Los archivos Makefile y las herramientas make se usan juntos para controlar la compilación y vinculación de proyectos de ingeniería. También se puede usar para escribir páginas de manual e instalación de programas. La herramienta make se utiliza para interpretar y ejecutar el contenido del archivo Make. El archivo MAKE normalmente contiene la relación de dependencia entre el archivo de origen y el archivo de destino y las reglas para generar el archivo de destino a partir del archivo de origen. La herramienta de creación puede determinar qué archivos deben recompilarse de acuerdo con el archivo MAKE, el orden de creación de los archivos de destino, etc.
 

1.2 m nombre de archivo akefile

Make reconocerá automáticamente GUNmakefile, Makefile y Makefile. Es mejor usar Makefile. Algunos sistemas no detectarán otros nombres de archivo.

Por supuesto, puede usar make -f xxx para especificar el archivo, intente usar makefilexxx al crear

1 .3 reglas de Makefile

Objetivo: dependiente

           mando

Objetivo: puede ser un nombre de archivo o una etiqueta, pero debe existir. Si la etiqueta es la primera, siempre se ejecutará.

Dependencia: puede utilizar nombres de archivo, caracteres, etc. No puede tener

Comando: agregue la tecla Tab desde el principio de la línea, no hay

test.o:test.s
	gcc -c test.s -o test.o

Nota: no existe una relación de secuencia inevitable entre reglas y reglas

           El primer objetivo se convertirá en el objetivo final.

           Antes de usar make, debe corregir la hora del sistema con precisión, porque el archivo Make se compila de acuerdo con el tiempo.

Supuesto : primero modifique fun1.c, luego elimine el original fun1.cy fun1.out, y cópielo nuevamente, aunque es el archivo original en este momento.

          Sin embargo, la hora de fun1.o y la aplicación ha cambiado, y el sistema detecta que la hora ha cambiado desde la última vez, por lo que no se ejecutará.

2.Composición de la estructura de Makefile y pasos de ejecución

2.1 Reglas explícitas

       Las reglas explícitas explican cómo generar uno o más archivos de objeto. Esto lo señala claramente el escritor de Makefile, los archivos que se generarán, los archivos dependientes de los archivos y los comandos que se generarán.

sr1=test.c
G=gcc
#include tes.mk
#AAA=$(patsubst *.c,*.o $(notdir $(wildcard /root/test1/714/*.c)))
#	echo "$(AAA)"
test.out:test.o
	gcc test.o -o $@
test.o:test.s
	gcc -c test.s -o test.o
#	echo "$(test)"
%.s:%.i
	${G} -S $^ -o $@
test.i:${sr1}
	${G} -E $^ -o $@

2.2 Reglas oscuras

Una cosa a tener en cuenta es que la expansión de "%" ocurre después de la expansión de variables y funciones, la expansión de variables y funciones ocurre cuando make carga el Makefile, y el "%" en la regla de patrón ocurre en tiempo de ejecución.

2.3 Definición de variable

(1) Las variables deben recibir valores iniciales cuando se definen. Generalmente, cuando se usan variables, agregue "$ (nombre de variable)" o "$ {nombre de variable}". Se recomienda (). Si hay una función , un recordatorio de color

SS=test.c
app:$(SS)
    gcc $(SS) -o app

(2) Operador:

=: Asignación de expansión retrasada

A=$(B)
B=hello
    echo "$(A)"


结果:
echo "hello"
hello

: =: Asignar inmediatamente

A:=$(B)
B=hello
    echo "$(A)"


结果:
echo ""
\r\n

+ =: Adjuntar asignación

A=$(B)
B=HELLO
B+=1111
app:
	echo "$(A)"


结果:
echo "HELLO 1111"
HELLO 1111
  

? =: Juzgue si la variable está asignada, si ha sido asignada antes, entonces no hay asignación, de lo contrario, asigne

fliet=1
fliet?=2  //判断是否赋值过
A=$(fliet)
app:
    echo "$(A)"

结果:
echo "1"
1

屏蔽fliet=1
echo "2"
2

 

$$: $

$ ^:    todas las dependencias en la regla

$ <: representa el primer nombre dependiente en la regla, si es una regla críptica, representa el primer nombre de archivo dependiente agregado por la regla críptica, usado junto con reglas como%

$ @: El nombre de destino de la regla actual

@: No mostrar en salida estándar /

2.4 Instrucciones de archivo

      Cuando se inicia el comando make, buscará otros Makefiles señalados por include y colocará su contenido en la ubicación actual. Al igual que la directiva #include de C / C ++.

      Si no se encuentra un archivo, make generará un mensaje de advertencia, pero no aparecerá ningún error fatal inmediatamente. Continuará cargando otros archivos. Una vez que termine de leer el archivo MAKE, make reintentará los archivos que no se encuentran o no se pueden leer. Si aún no funciona, make mostrará un mensaje fatal. Si desea hacer que ignore los archivos que no se pueden leer y continuar con la ejecución, puede agregar un signo menos "-" antes de la inclusión. Como por ejemplo: -include <nombre de archivo>

vim test.mk
写入A=HELLO

vim makefile

include test.mk
    echo "A"

结果:
HELLO

2.5 Falsos objetivos

Ejecutar con la etiqueta especificada: (make -f xxfile clean)

clean:
	rm *.out test
.PHONY:clean

2.6 Pasos de ejecución

Cargue el archivo makefile -> expanda el archivo makefile en inlcude -> inicialización de variables -> derive las reglas oscuras, analice todas las reglas

——> Cree una cadena de dependencias para el archivo de destino ——> Decida cuáles deben generarse de acuerdo con las dependencias ——> Ejecutar

Si la variable se usa en el archivo MAKE, no se expandirá inmediatamente cuando se cree la cadena de dependencia. Si finalmente se usa la dependencia en la variable, realmente se expandirá

3.función makefile

3.1 Coincidir con los archivos en el directorio especificado

3.2 Eliminar la ruta del archivo

3.3 Función de reemplazo de patrón

3.4 Función anti-filtro

2. Bibliotecas estáticas y dinámicas

(1). Biblioteca estática:

Al compilar, toda la biblioteca se cargará en el código de destino.

Ventajas: no es necesario el soporte de biblioteca de funciones externas después de la compilación, velocidad de ejecución rápida

Desventajas: si se cambia la biblioteca estática, es necesario volver a compilar el código, el archivo compilado es más grande que la biblioteca dinámica

paso:

(2) Biblioteca dinámica:

     Al compilar, no se cargará en el código de destino, pero la interfaz relevante está reservada y se cargará solo cuando se use durante la ejecución del programa.

     Ventajas: La cantidad de compilación es relativamente pequeña, la biblioteca y el código son relativamente independientes y la actualización de la biblioteca no afecta el uso del programa.

     Desventajas: velocidad de carga lenta.

    paso:          

La biblioteca dinámica está en el directorio actual, ¿por qué el sistema operativo indica que no se puede encontrar el archivo?

Motivo: el sistema operativo busca las bibliotecas correspondientes en ubicaciones estándar de forma predeterminada: / lib, / usr / lib, usr / local / lib. Pero si no se encuentra el archivo de la biblioteca dependiente, búsquelo en la variable de entorno LD_LIBRARY_PATH.

En otras palabras, el archivo de biblioteca dinámica debe colocarse en la ubicación estándar o en la ubicación especificada por LD_LIBRARY_PATH antes de que el sistema operativo pueda encontrarlo.

Solución:

1) A través de variables de entorno, exportar LD_LIBRARY_PATH = ruta de biblioteca dinámica

export LD_LIBRARY_PATH =. / lib Temporalmente efectivo, la variable de entorno de reinicio del terminal no es válida // Determine la ruta de búsqueda de la biblioteca dinámica.

2) Efectivo permanentemente: "export LD_LIBRARY_PATH = ruta de biblioteca dinámica" se escribe en el archivo de configuración del terminal ~ / .bashrc Se recomienda utilizar una ruta absoluta.

3) Copie la biblioteca dinámica personalizada en la ubicación estándar

3.Ejercicios de Makefile

(1) Utilice makefile para compilar todos los archivos .c en la ruta especificada para generar .o, y generar archivos ejecutables al mismo tiempo

4. Genere automáticamente Makefile

 

Los círculos de la figura indican comandos, los cuadrados indican archivos y las cursivas indican archivos que debe escribir o modificar usted mismo.

 

  1. Ejecute el comando autoscan en el directorio donde se almacena el código fuente para generar el archivo configure.scan;

  2. Cambie el nombre del archivo configure.scan a configure.in o configure.ac (use el sufijo .in en los primeros días) y modifique su configuración predeterminada;

  3. Ejecute dos comandos, aclocal y autoconf , para generar aclocal.m4 y configurar archivos respectivamente;

  4. Ejecute el comando autoheader , escanee el archivo configure.ac y genere el archivo config.h.in;

  5. Cree un archivo llamado Makefile.am e ingrese el contenido correspondiente.

  6. Ejecute automake , genera Makefile.in de acuerdo con el archivo Makefile.am.

  7. Ejecute el archivo de script ./configure , que genera el archivo Makefile final de acuerdo con el archivo Makefile.in

 

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_45604814/article/details/110495437
Recomendado
Clasificación