CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
O que o $@
e $<
faz exatamente?
Respostas:
$@
é o nome do arquivo que está sendo gerado e$<
o primeiro pré-requisito (geralmente o arquivo de origem). Você pode encontrar uma lista de todas essas variáveis especiais no manual Make GNU .Por exemplo, considere a seguinte declaração:
Nesse caso:
$@
avalia comoall
$<
avalia comolibrary.cpp
$^
avalia comolibrary.cpp main.cpp
fonte
$@
não precisa necessariamente ser um arquivo, mas também pode ser o nome de um.PHONY
destino.$@s
gerar saída de montagem como name.os?As variáveis
$@
e$<
são chamadas de variáveis automáticas . A variável$@
representa o nome do arquivo criado (ou seja, o destino) e$<
representa o primeiro pré-requisito necessário para criar o arquivo de saída.Por exemplo:
Aqui
hello.o
está o arquivo de saída. É para isso que se$@
expande. A primeira dependência éhello.c
. Isso é o que$<
expande.A
-c
bandeira gera o.o
arquivo; vejaman gcc
para uma explicação mais detalhada. o-o
especifica o arquivo de saída a ser criado.Para mais detalhes, você pode ler este artigo sobre Makefiles do Linux .
Além disso, você pode verificar os manuais GNU
make
. Isso tornará mais fácil criar Makefiles e depurá-los.Se você executar este comando, ele produzirá o banco de dados makefile:
fonte
$<
será expandida parahello.c hello.h
(ambos). Por favor, esclareça.$<
é apenas o primeiro item. Para incluir tudo, use$^
.De Gerenciando projetos com o GNU Make, 3ª edição, p. 16 (está sob GNU Free Documentation License ):
fonte
O
$@
e$<
macros são especiais.Onde:
$@
é o nome do arquivo do destino.$<
é o nome da primeira dependência.fonte
O Makefile constrói o
hello
executável se qualquer um dosmain.cpp
,hello.cpp
,factorial.cpp
mudou. O menor Makefile possível para atingir essa especificação poderia ter sido:Para melhorar o exposto, compilamos apenas os arquivos C ++ que foram editados. Em seguida, apenas vinculamos os arquivos de objeto resultantes.
Para melhorar isso, podemos substituir todas as regras de arquivo de objeto por uma única
.cpp.o
regra:Aqui a
.cpp.o
regra define como construir aanyfile.o
partiranyfile.cpp
.$<
corresponde à primeira dependência, neste caso,anyfile.cpp
$@
corresponde ao alvo, neste casoanyfile.o
,.As outras alterações presentes no Makefile são:
fonte
por exemplo, se você deseja compilar fontes, mas possui objetos em um diretório diferente:
Você precisa fazer :
mas com a maioria das macros, o resultado será todos os objetos seguidos por todas as fontes, como:
portanto, isso não compilará nada ^^ e você não poderá colocar seus arquivos de objetos em um diretório diferente :(
a solução é usar essas macros especiais
isso gerará um arquivo .o (obj / file.o) para cada arquivo .c no SRC (src / file.c)
Isso significa :
mas linhas por linhas, em vez de todas as linhas de OBJ, seguidas por todas as linhas de SRC
fonte