Modelo Makefile para una biblioteca compartida en C (con explicaciones)
Última actualización el 28 de octubre de 2019
tl; dr: Guarde el siguiente archivo como Makefile
y cambie los archivos fuente por los que desee.
# Makefile template for a shared library in C
# https://www.topbug.net/blog/2019/10/28/makefile-template-for-a-shared-library-in-c-with-explanations/
CC = gcc # C compiler
CFLAGS = -fPIC -Wall -Wextra -O2 -g # C flags
LDFLAGS = -shared # linking flags
RM = rm -f # rm command
TARGET_LIB = libtarget.so # target lib
SRCS = main.c src1.c src2.c # source files
OBJS = $(SRCS:.c=.o)
.PHONY: all
all: ${TARGET_LIB}
$(TARGET_LIB): $(OBJS)
$(CC) ${LDFLAGS} -o $@ $^
$(SRCS:.c=.d):%.d:%.c
$(CC) $(CFLAGS) -MM $< >$@
include $(SRCS:.c=.d)
.PHONY: clean
clean:
-${RM} ${TARGET_LIB} ${OBJS} $(SRCS:.c=.d)
El fragmento de código anterior también está disponible en GitHub gist.
Explicación
Proceso básico: para cada archivo fuente C (example.c
), el compilador de C, con el -MM
switch, crea un archivo de reglas (example.d
). El archivo de reglas describe las dependencias (por ejemplo, archivos de encabezado) del archivo objeto (example.o
) correspondiente al archivo fuente C. Luego, el compilador C compila cada archivo fuente C en un archivo objeto. El vinculador vincula todos los archivos objeto de la biblioteca compartida.
- Líneas 4 a 8: el comando del compilador, los indicadores del compilador, los indicadores del vinculador, el comando de eliminación y el nombre de la biblioteca de destino, respectivamente.
- Línea 10: La lista de archivos fuente.
- Línea 11: Archivos objeto, deducidos de la lista de archivos fuente reemplazando el
.c
sufijo con.o
. - Líneas 13-14: El
all
El objetivo depende del objetivo de la biblioteca de destino. En otras palabras, la construcción delall
objetivo, que es el predeterminado cuando funcionamake
tendrá la biblioteca de destino construida. - Línea 16: La biblioteca de destino depende de la presencia de todos los archivos de objetos.
- Línea 17: Construya la biblioteca de destino (
$@
) aplicando el comando del compilador especificado ($(CC)
) con los indicadores del enlazador especificados ($(LDFLAGS)
) para todos los archivos de objetos ($^
). - Línea 19: Hay un archivo de reglas (
*.d
) para cada archivo fuente C. Su nombre de archivo se determina reemplazando el.c
sufijo con.d
. - Línea 20: cree cada archivo de reglas (
$@
) aplicando a su correspondiente archivo fuente C ($<
) el comando del compilador especificado ($(CC)
) con los indicadores del compilador especificados ($(CFLAGS)
) y el-MM
bandera. - Línea 22: Incluya los archivos de reglas como parte del Makefile.
- Líneas 24-26: El
clean
target, que elimina todos los archivos generados (${TARGET_LIB}
,${OBJS}
,$(SRCS:.c=.d)
) usando el comando eliminar (${RM}
). Esto puede ser invocado pormake clean
.