Última atualização em 28 de outubro de 2019
tl; dr: Salve o seguinte arquivo como Makefile
e altere os arquivos de origem para os que você pretende.
# 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)
O trecho de código acima também está disponível em Github Gist.
Explicação
Processo básico: para cada arquivo de origem C (example.c
), o compilador C, com o -MM
alternar, cria um arquivo de regra (example.d
). O arquivo de regra descreve as dependências (por exemplo, arquivos de cabeçalho) do arquivo de objeto (example.o
) correspondentes ao arquivo de origem C. O compilador C compila cada arquivo de origem C com um arquivo de objeto. O vinculador vincula todos os arquivos de objeto à biblioteca compartilhada.
- Linhas 4-8: o comando compilador, sinalizadores do compilador, sinalizadores de ligação, comando de deleção e nome da biblioteca de destino, respectivamente.
- Linha 10: a lista de arquivos de origem.
- Linha 11: arquivos de objeto, inferidos da lista de arquivos de origem substituindo o
.c
sufixo com.o
. - Linhas 13–14: o
all
O alvo depende do destino da biblioteca de destino. Em outras palavras, construindo oall
alvo, que é o padrão ao executarmake
terá a biblioteca de destino construída. - Linha 16: A biblioteca de destino depende da presença de todos os arquivos de objeto.
- Linha 17: construa a biblioteca de destino (
$@
) aplicando o comando compilador especificado ($(CC)
) com os sinalizadores de ligação especificados ($(LDFLAGS)
) a todos os arquivos de objeto ($^
). - Linha 19: Existe um arquivo de regra (
*.d
) para cada arquivo de origem C. Seu nome de arquivo é determinado substituindo o.c
sufixo com.d
. - Linha 20: Crie cada arquivo de regra (
$@
) aplicando -se ao seu arquivo de origem C correspondente ($<
) o comando compilador especificado ($(CC)
) com as bandeiras do compilador especificado ($(CFLAGS)
) e o-MM
bandeira. - Linha 22: inclua os arquivos de regra como parte do Makefile.
- Linhas 24–26: o
clean
Target, que exclui todos os arquivos gerados (${TARGET_LIB}
Assim,${OBJS}
Assim,$(SRCS:.c=.d)
) usando o comando de deleção (${RM}
). Isso pode ser invocado pormake clean
.