O Makefile é muito bom para organizar o projeto, mas ele é chato no sentido da sintaxe dele, para indentar, você tem que usar tab para isso, caso não ele não identifica o comando corretamente.
E ele me ajuda a evitar ter que escrever toda vez no terminal os comandos.
spellchecker: sllist.o hashtable.o main.o spellchecker.o
gcc sllist.o main.o hashtable.o spellchecker.o -o spellchecker
sllist.o: sllist.c
gcc -g3 -c -Wall -Werror -std=c99 -O0 sllist.c
main.o: main.c
gcc -g3 -c -Wall -Werror -std=c99 -O0 main.c
hashtable.o: hashtable.c
gcc -g3 -c -Wall -Werror -std=c99 -O0 hashtable.c
spellchecker.o: spellchecker.c
gcc -g3 -c -Wall -Werror -std=c99 -O0 spellchecker.c
.PHONY: clean
clean:
rm *.o spellchecker test
De vez compilar manualmente os arquivos, eu criei um Makefile que por exemplo
Quando eu chamar o make spellchecker ele vai compilar todas as dependencias para mim e de spellchecker antes de eu compilar o spellchecker.
Isso agiliza muito o trabalho.
EXECUTABLE = swpathtracer
IMAGE = output_image
CXX = g++
CXXFLAGS = -std=c++11 -Wall -Wextra -Wpedantic -fopenmp -DDEBUG -O0 -g3
# ifeq ($(DEBUG), 1)
# CXXFLAGS += -DDEBUG -O0 -g3
# else
# CXXFLAGS += -DNDEBUG -O3 -g0
# endif
CPPFLAGS += -MMD \
-I../../../../work/common/glm-0.9.7.0 \
-I/usr/local/include
LDFLAGS = -L/usr/lib/gcc/x86_64-linux-gnu/4.8 \
-L/usr/lib/x86_64-linux-gnu \
-L/usr/lib \
-L/usr/local/lib
LDLIBS = -lassimp -fopenmp
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CXX) $^ -o $@ $(LDLIBS)
.cpp.o:
-include $(OBJECTS:.o=.d)
.PHONY: clean distclean run png clpng
clean:
rm *.o *.d
distclean: clean
rm $(EXECUTABLE)
run: swpathtracer
./swpathtracer
png:
convert $(IMAGE).ppm $(IMAGE).png
clpng: $(IMAGE).png
rm $(IMAGE).png
Esse outro Makefile aqui, eu utilizo o g++ também, mas como você pode ver eu coloquei ele em uma variável chamada CXX, onde tiver CXX ele substitui, com isso posso trocar de compilador C++ facilmente e funciona para projetos C também.