Red de conocimiento informático - Problemas con los teléfonos móviles - [Linux] Escriba un programa C simple usando un Makefile.

[Linux] Escriba un programa C simple usando un Makefile.

VIII Variables de entorno

8.1 Ver variables de entorno

$ env ? Mostrar todas las configuraciones de variables de entorno

$ echo $ENV_VARIABLE ? /p >

Ejemplo:

$ echo $PATH

/bin:/etc:/usr/bin:/tcb/bin

8.2 Configuración variables de entorno

$ ENV_VARIABLE=XXX;exportar ENV_VARIABLE

Ejemplo:

$ PATH?

$ PATH=$PATH:$INFORMIXDIR /bin ;exportar PATH ? Establecer la variable de entorno PATH al valor de PATH original + $INFORMIXDIR/bin

8.3 Desarmar variables de entorno

$ unset $ENV_VARIABLE

Ejemplo:

$ set GZJ=gzj;exportar GZJ ?Establecer variable de entorno GZJ

$ echo $GZJ

gzj ?Mostrar valor de variable de entorno

$ unset $GZJ ?Desarmar variable de entorno GZJ

$ echo $GZJ Cancelar

I makefile reglas

makefile es un archivo de script que describe las reglas de creación. incluyendo cuatro tipos de líneas: líneas de destino, líneas de comando, líneas de definición de macros y líneas de directivas de creación (como "incluir"). Cuando no se puede escribir una línea, puede utilizar el carácter de continuación de línea "\" para pasar a la siguiente línea.

1.1 Línea de destino

La línea de destino le indica a make qué construir. Consiste en una lista de nombres de destino, dos puntos ":" y una tabla de dependencias.

Ejemplo:

ejemplo: depfile deptarget

Esta línea indica que el ejemplo de destino depende de depfile y deptarget. Si se modifica depfile o deptarget, el destino. ser regenerado.

ejemplo1 ejemplo2 ejemplo3: deptarget1 deptarget2 depfile

Esta línea indica que tres objetivos independientes (ejemplo1, ejemplo2 y ejemplo3) en la tabla de nombres de objetivos se generan con la misma lista de dependencias y reglas de .

Limpiar:

Una lista de dependencias vacía significa que el objetivo limpio no tiene otras dependencias.

La línea que comienza con Tab después de la línea de destino representa las reglas de generación del objetivo. El carácter Tab no se puede reemplazar por un espacio. Por ejemplo

ejemplo.o:ejemplo.c ejemplo.h

cc -c ejemplo.c

Este ejemplo significa que el objetivo ejemplo.o depende de ejemplo.c y ejemplo.h. Si ejemplo.h cambia, debe ejecutar el comando cc -c ejemplo.c para regenerar el ejemplo de destino.o.

Puedes usar la coincidencia de patrones de nombres de archivos para generar automáticamente una tabla de dependencias para un objetivo, por ejemplo:

prog: *.c

Aquí hay un archivo MAKE simple ejemplo:

Figura 1 El ejemplo de archivo MAKE más simple

Make utiliza el archivo MAKE escaneando desde el primer objetivo.

El primer objetivo en el ejemplo anterior es todo, por lo que la limpieza del objetivo no se ejecutará automáticamente y se puede generar usando el comando make clean.

1.2 Línea de comando

La línea de comando se utiliza para definir la operación del objetivo de compilación.

El archivo después del punto y coma ";" en la línea de destino se trata como un comando, o la línea que comienza con un carácter de tabulación también es un comando.

Por ejemplo, en el ejemplo anterior del archivo MAKE, el comando cc en la tercera línea que comienza con el carácter Tabulador es una línea de comando que indica el comando a ejecutar cuando se genera hola. También se puede escribir como: hola:hola.o;cc -c hola -L...

Normalmente, los comandos en la línea de comando se mostrarán en la salida estándar, por ejemplo, ejecutar make en el archivo MAKE anterior Al ejecutar el comando, la salida estándar es la siguiente:

cc -c hello.c

cc -o hello -L/usr/X11R6/lib -L /usr/lib -lXm -lXt - lX11 hola.o

cc -c hola1.c

cc -o hola1 -L/usr/X11R6/lib - L/usr/ lib -lXm -lXt -lX11 hello1. o

Si no desea que se repita el comando, puede agregar el carácter @ antes del comando; por ejemplo, en el ejemplo anterior, no lo desea. para hacer eco de cc -c hello.c y cc -c hello1.

Figura 2 Ejemplo de archivo MAKE que suprime las devoluciones de llamadas

Cuando se ejecuta make en este archivo MAKE, la salida estándar es la siguiente :

cc -o hola -L/usr/X11R6 /lib -L/usr/lib -lXm -lXt -lX11 hola.o

cc -o hola1 -L/usr /X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1 o

Como puede ver, el carácter @ delante de la línea de comando no tiene eco.

1.3 Línea de definición de macro

En el archivo MAKE, puede usar definiciones de macro para reducir la entrada del usuario. Por ejemplo, en el ejemplo anterior, las opciones de compilación de hola y hola1 son ". -L/ usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 ", en este caso, puede usar macros en su lugar, como g.

Figura 3 Ejemplo de uso de macros para define makefile

La sintaxis básica para la definición de macros es:

nombre=valor

Al definir macros, el orden no es importante. No es necesario definir las macros antes de su uso. Si una macro se define varias veces, se utiliza el último valor definido.

Las macros se pueden citar usando el carácter "$" y "() " o "{}", por ejemplo:

cc -o hola.o $(CCFLAGS) hola. o

También puedes asignar una macro a otra macro, pero esta definición no puede anidarse en un bucle, por ejemplo:

cc -o hola.o $(CCFLAGS) hola. o

p>

También puedes asignar una macro a otra macro. Por ejemplo:

A=valor1

B=valor2

C=$(A) $(B) es equivalente a C=valor1 valor2

1.4 Pseudo instrucciones

Los archivos Make se componen principalmente de líneas de definición de macro, líneas de comando y líneas de destino. El cuarto tipo es la línea de directiva make. Las directivas Make no están estandarizadas y diferentes marcas pueden admitir diferentes conjuntos de directivas, lo que hace que los archivos Make sean algo incompatibles.

Si le preocupa la portabilidad, debe evitar utilizar la directiva make. Sin embargo, algunas directivas, como include, se utilizan con más frecuencia y las proporcionan muchos fabricantes diferentes.

1.4.1 directiva include

Esta directiva es similar a #include en lenguaje C, que le permite escribir una definición de uso común e incluirla toda a la vez. Por ejemplo:

incluir default.mk

1.4.2 Directiva "#"

El carácter "#" también es una directiva de make, que especifica " #" " debe ir seguido de un comentario, por ejemplo

PROGNAME=test # Definir macro

#no modificar esto

Dos reglas de sufijo

2.1 Reglas de doble sufijo

En los ejemplos anteriores de archivos MAKE, hay muchos duplicados. Por ejemplo, los comandos para generar hola y hola1 son similares, y los comandos para generar hola.o y hola1. .o son similares, excepto que deben compilarse. O los archivos vinculados son diferentes, pero otros comandos son iguales, entonces podemos usar reglas de sufijo. Comencemos con el ejemplo de doble sufijo:

Figura 4 Ejemplo de un archivo MAKE que usa una regla de doble sufijo

La regla de sufijo usa el nombre de destino especial ".SUFFIXES".

La tabla de dependencia de .SUFFIXES en la primera línea está vacía para borrar las reglas de sufijo originales, porque .SUFFIXES se puede usar varias veces en el archivo MAKE, cada vez se basará en la regla de sufijo anterior. Agregue nuevas reglas de sufijos.

Especifique la regla del sufijo como ".c .o" en la segunda línea, lo que significa que todos los archivos .c se convertirán en archivos .o.

La tercera línea especifica el método para convertir el archivo .c en un archivo .o. $(CC) es una macro predefinida de make, el valor predeterminado es cc, $< es una macro especial que se utiliza para reemplazar el archivo fuente actual, es decir, todos los archivos .c que se compilarán.

La línea 6 especifica cómo generar los objetivos hola y hola1. $@ es una macro especial que se utiliza para reemplazar el nombre del archivo de destino actual, que es hola y hola1, y $@.o es hola.o y hola1.o.

El ejemplo anterior describe la regla del doble sufijo, que contiene dos sufijos, como .c.o, para compilar un archivo fuente C en un archivo objeto. Las reglas de doble sufijo describen cómo crear un archivo de un segundo tipo de sufijo a partir de un archivo del primer tipo de sufijo; por ejemplo, una regla .c.o describe cómo crear un archivo .o a partir de un archivo .c.

2.2 Regla de sufijo único

La regla de sufijo único describe cómo generar un archivo con su nombre base a partir de un archivo con un sufijo específico. Por ejemplo, utilizando la regla de sufijo único .c, puede generar archivos hola y hola1 desde hola.c y hola1.c. Por ejemplo, cambie el archivo MAKE anterior a:

Figura 5 Ejemplo de un archivo MAKE que utiliza una regla de sufijo único

Dado que la regla de sufijo .c es una regla de sufijo estándar de creación, make especificará la línea de comando apropiada, por lo que no tiene que especificar una línea de comando específica en el archivo MAKE desde el que desea generarlo.

La siguiente tabla enumera las reglas de sufijos estándar proporcionadas por make.

Tabla 1 Crear reglas de sufijo estándar

Línea de comando de regla de sufijo

.c $(LINK.c) -o $@ $< $(LDLIBS)

.c.ln $(LINK.c) $(OPCIÓN DE SALIDA) -i $<

.c.o $(COMPILE.c) $(OPCIÓN DE SALIDA) $< p>

.c.a $(COMPILE.c) -o $% $<

$(AR) $(ARFLAGS) $@ $%

$(RM ) $ %

Tres destinos especiales

Destinos especiales Utilice SUFIJOS en las reglas de sufijos para especificar reglas de sufijos adicionales. make también proporciona varios objetivos especiales para establecer el comportamiento de make. Los siguientes son algunos de los objetivos especiales: .IGNORE

Make utiliza el objetivo especial .IGNORE, el valor predeterminado de make, al ejecutar una línea de comando que devuelve un. código de error. La operación es parar y salir. Después de agregar este objetivo, make ignorará los códigos de error devueltos desde la línea de comando y continuará con las operaciones posteriores. .SILENT

Como se mencionó anteriormente, make muestra el contenido de la línea de comando cuando se ejecuta. Agregar el carácter "@" antes de una línea de comando suprimirá la visualización de la línea de comando.

Si agrega este destino, ya no se repetirán todas las líneas de comando, lo que equivale a agregar el carácter "@" antes de cada línea de comando. .PRECOUS

Cuando se recibe una señal o un comando de shell devuelve un código de error distinto de cero, make eliminará todos los archivos que creó. Sin embargo, incluso si ocurre un error, el usuario no quiere eliminar ciertos archivos, que pueden usarse como argumentos para el objetivo .PRECIOUS. Puede aparecer varias veces en el archivo MAKE, cada vez acumulando una lista de archivos. .SUFFIXES

Especifica una nueva regla de sufijo para el archivo MAKE. La nueva regla de sufijo se proporcionará como una tabla de dependencia de .SUFFIXES. SUFFIXES se puede usar varias veces en un archivo MAKE, cada vez agregando una nueva regla de sufijo a las reglas de sufijo anteriores o, si la tabla de dependencias de .SUFFIXES está vacía, configurando la tabla de reglas de sufijo en vacía.

Cuatro macros especiales

Para facilitar el uso de reglas, make proporciona varias macros especiales: $@

El nombre del objetivo actual se puede reemplazar con el macro "$@" el valor completo. $<

Puede reemplazar el archivo fuente actual con "$<". Por ejemplo, el ejemplo anterior usa $(CC) -c $<, donde "$<" son todos los archivos .c que se van a compilar. La macro "$< " sólo es válida en reglas de sufijo o .DEFAULT. $*

El nombre base del objetivo actual será reemplazado por la macro "$*". Por ejemplo, si el nombre de destino es hola.o, el nombre base es hola sin el sufijo .o.

Las macros especiales anteriores utilizan las reglas propias de Make y el usuario no puede cambiarlas.

Usar valores predeterminados de macros

Comandos de ensamblaje de documentación de biblioteca AR ar

ARFLAGS rv

AS as

ASFLAGS

COMPILE.s $(AS) $(ASFLAGS) $(TARGET ARCH)

Comando del compilador C CC cc

CFLAGS

CPPFLAGS

COMPILE.c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET ARCH) -c

LINK.c $(CC) $(CFLAGS) $ ( . mod .mod~ .sym

.def .def~ .p .p~ .r .r~ .y .y~ .h .h~ .sh .sh~ .cps .cps~

Cinco usos de makefile

Cuando se llama a make, busca un archivo llamado "makefile" o "Makefile" en el directorio actual y lo ejecuta

<. Si no desea utilizar el archivo predeterminado anterior, puede usar "-f" para especificar el archivo en la línea de comando; por ejemplo, si asigna el nombre mklib al archivo MAKE que está escribiendo, debe especificar "make -f mklib"