Meu diretório de projeto se parece com este:
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
O que eu gostaria que meu makefile fizesse seria compilar todos os .cpp
arquivos da /src
pasta para os .o
arquivos da /obj
pasta e, em seguida, vincular todos os .o
arquivos /obj
ao binário de saída na pasta de nível superior /project
.
Não tenho quase nenhuma experiência com Makefiles e não tenho certeza do que pesquisar para fazer isso.
Além disso, essa é uma "boa" maneira de fazer isso ou existe uma abordagem mais padrão para o que estou tentando fazer?
c++
build-process
makefile
Austin Hyde
fonte
fonte
Respostas:
Makefile parte da questão
Isso é muito fácil, a menos que você não precise generalizar, tente algo como o código abaixo (mas substitua a indentação de espaço por guias próximas a g ++)
Geração de gráfico de dependência automática
Um recurso "obrigatório" para a maioria dos sistemas make. Com GCC in pode ser feito em uma única passagem como um efeito colateral da compilação, adicionando
-MMD
sinalizadorCXXFLAGS
e-include $(OBJ_FILES:.o=.d)
ao final do corpo do makefile:E como os caras já mencionaram, sempre tenha o GNU Make Manual por perto, é muito útil.
fonte
OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
.$<
deveria ser$^
para a regra de main.exe e acho que há um erro de digitação comobj/%.o: src/%cpp
.make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
O curinga também funciona para mim, mas gostaria de dar uma nota lateral para aqueles que usam variáveis de diretório. Sempre use barra para a árvore de pastas (não barra invertida), caso contrário, ocorrerá falha:
fonte