Создать & quot; Makefile & quot; выглядеть лучше

Мой make-файл работает нормально (GNU Make), но мне было интересно,

  • Есть способ сделать новый каталог «bin» и поместить туда все .o
  • Если ответом «1» является «да», может ли инструкция «очистить» удалить папку «bin»?
  • Избегать записи всех имен файлов .cpp и .o?
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)

0

Решение

Начиная с последнего вопроса, вы можете определить неявные правила для преобразования .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
3

Другие решения

Это хорошая идея, чтобы указать вещи из этих источников, а не через некоторый промежуточный продукт, такой как .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)
2

Подумайте об использовании какого-либо инструмента сборки make-файлов, такого как cmake или qmake. По моему опыту, не называть явно все исходные файлы в makefile опасно.

Если вы onlinux, попробуйте просто

qmake -project && qmake && make

в вашем исходном каталоге.
QMake сделает всю магию за вас, создавая make-файл. Я верю, что cmake сделает это тоже.

0