Makefile Learning 7: reglas de patrones estáticos y compilación de biblioteca dinámica

I. Introducción

        Este artículo toma un Makefile compilado por una biblioteca dinámica como ejemplo para explicar el uso de reglas del modo estático en make, profundizar el estudio de Makefile en todos los aspectos y lograr el propósito de aplicar lo que ha aprendido.

2. Reglas del modo estático

1. gramática

TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ...
    COMMANDS
    ...

        Como se puede ver en las reglas gramaticales anteriores, las reglas de patrones estáticos contienen tres partes: TARGETS , TARGET-PATTERN y PREREQ-PATTERNS .

OBJETIVOS : muestra una lista de archivos de destino para esta regla ; puede contener comodines.

PATRÓN OBJETIVO : patrón objetivo. Generalmente se incluye "%", donde "%" puede coincidir con cualquier parte del archivo de destino y la parte coincidente se llama "tallo". Además, el archivo de destino y el resto del patrón de destino deben coincidir exactamente, por ejemplo. :

Archivo objeto: foo.o

Patrón de objeto: % .o

raíz: foo -> coincidencias de patrones

Archivo objeto: foo.c

Patrón de objeto: % .o

tallo: ninguno -> el patrón no coincide

PREREQ-PATTERNS : Patrones de dependencia. Los archivos de dependencia para cada destino se obtienen utilizando la "fuente" del patrón de destino en lugar del "%" en el patrón de dependencia. Los ejemplos son los siguientes:

Archivo objeto: foo.o

Patrón de objeto: %.o

Dependencia objetivo: %.c

        De acuerdo con el archivo de destino foo.o y la dependencia de destino %.o, de la introducción anterior se puede concluir que el "raíz" es "foo", por lo que % en la dependencia de destino %.c puede reemplazarse por foo, por lo que la dependencia objetivo es foo.c.

2. Ejemplos

objects = foo.o bar.o

all: $(objects)

$(objects): %.o: %.c
	$(CC) -c $(CFLAGS) $< -o $@

        De acuerdo con la explicación de la gramática anterior, se puede saber que el archivo de destino del Makefile es foo.o bar.o, el modo de destino es %.o y la dependencia de destino es %.c. Según el archivo de destino y el modo de destino, el "tronco" es foo y bar, por lo que el modo de destino es foo.o y bar.o, y la dependencia de destino es foo.c y bar.c. Entonces, equivalente a las siguientes reglas:

foo.o : foo.c
	$(CC) -c $(CFLAGS) foo.c -o foo.o
	
bar.o : bar.c
	$(CC) -c $(CFLAGS) bar.c -o bar.o

2. Ejemplos de compilación dinámica de bibliotecas.

1. Estructura del código

├── include
│   ├── a.h
│   ├── b.h
│   ├── c.h
│   └── d.h
├── obj
└── src
    ├── a.c
    ├── b.c
    ├── c.c
    └── d.c

2.Proposito

        Compile todos los archivos de lenguaje C en src en una biblioteca dinámica libtest.so y coloque los archivos de objetos y bibliotecas compilados en el directorio obj.

3. Escritura de archivos Make

INCDIR := include
SRCDIR := src
OBJDIR := obj
TARGET := libtest.so

SRCS := $(wildcard $(SRCDIR)/*)
OBJS := $(SRCS:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

CFLAGS += -Wall -g -I include -fPIC
LDFLAGS += -fPIC -shared

$(OBJDIR)/$(TARGET):$(OBJS)
	gcc $(LDFLAGS) $^ -o $@ 

$(OBJS):$(OBJDIR)/%.o:$(SRCDIR)/%.c
	@mkdir -p $(OBJDIR)
	gcc $(CFLAGS) -c $< -o $@

.PHONY:clean 
clean:
	@rm -rf $(OBJDIR)/*

        El ejemplo anterior ( $(OBJS):$(OBJDIR)/%.o:$(SRCDIR)/%.c ) utiliza las reglas del modo estático de Makefile, donde OBJS es el archivo objeto (obj/ao obj/co obj/ bo obj/do), y $(OBJDIR)/%.o es el modo de destino (obj/%.o), por lo que los "troncos" son a, b, cyd respectivamente, y las dependencias de destino son src/ac , origen /bc, origen/cc y origen/dc. La función de este fragmento de código es compilar cada archivo de lenguaje C en un archivo objeto, respectivamente.

        Finalmente, la regla $(OBJDIR)/$(TARGET):$(OBJS) compila todos los archivos objeto en la biblioteca dinámica final.

3. Resumen

        Este artículo explica el uso de reglas de patrones estáticos en Makefile y profundiza la comprensión de las reglas de patrones estáticos a través de un ejemplo de compilación de biblioteca dinámica.

Supongo que te gusta

Origin blog.csdn.net/to_be_better_wen/article/details/131841200
Recomendado
Clasificación