Мой make-файл работает нормально (GNU Make), но мне было интересно,
CFLAGS = -Wall -g CC = g++ EXEC = main OBJ = listpath.o Parser.o main.o all: $(EXEC) listpath.o: src/listpath.cpp $(CC) $(CFLAGS) -c src/listpath.cpp Parser.o: src/Parser.cpp $(CC) $(CFLAGS) -c src/Parser.cpp main.o: src/main.cpp $(CC) $(CFLAGS) -c src/main.cpp $(EXEC): $(OBJ) $(CC) $(CFLAGS) $(OBJ) -o $(EXEC) .cpp.o: $(CFLAGS) $< .PHONY: clean clean: rm $(OBJ) $(EXEC)
Начиная с последнего вопроса, вы можете определить неявные правила для преобразования .c файлов в .o файлы.
bin/%.o : src/%.cpp | bin
$(CC) $(CFLAGS) -c $< -o $@
Это также выведет .o файлы в каталог bin /.
Теперь ваше правило результата будет выглядеть так:
$(EXEC): $(addprefix bin/, $(OBJ))
$(CC) $(CFLAGS) $^ -o $@
Чтобы очистить каталог bin /, просто измените правило очистки на:
clean:
rm -rf bin/ $(EXEC)
Наконец, добавьте правило для создания каталога bin:
bin:
mkdir -p bin
Это хорошая идея, чтобы указать вещи из этих источников, а не через некоторый промежуточный продукт, такой как .o файлы. Используйте подстановку шаблонов для генерации названий этих промежуточных продуктов. Если вы используете один и тот же шаблон для компиляции каждого файла, вам не нужно указывать его несколько раз. Используйте шаблоны make.
# The first rule that make sees is the default target.
# I like to put the default target right up front so there is no doubt.
default: all
SRC = src/listpath.cpp src/Parser.cpp src/main.cpp
# Or SRC = $(wildcard src/*.cpp)
# Generate list of object files.
OBJ = $(patsubst %.cpp, bin/%.o, $(notdir $(SRC)))
# Compile rule
$(OBJ): bin/\%.o : src/%.cpp bin
$(CC) $(CFLAGS) -c $< -o $@
бен:
Mkdir bin
# Link rule
$(EXEC): $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o $(EXEC)
all: $(EXEC)
clean:
rm -rf bin $(EXEC)
Подумайте об использовании какого-либо инструмента сборки make-файлов, такого как cmake или qmake. По моему опыту, не называть явно все исходные файлы в makefile опасно.
Если вы onlinux, попробуйте просто
qmake -project && qmake && make
в вашем исходном каталоге.
QMake сделает всю магию за вас, создавая make-файл. Я верю, что cmake сделает это тоже.