让"Makefile"看起来更好



我的makefile工作正常(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)

从最后一个问题开始,您可以定义隐式规则将 .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 $@

.bin: 姆克迪尔·宾

# Link rule
$(EXEC): $(OBJ)
  $(CC) $(CFLAGS) $(OBJ) -o $(EXEC)
all: $(EXEC)
clean:
   rm -rf bin $(EXEC)

考虑使用一些makefile构建工具,如cmake或qmake。根据我的经验,不显式命名makefile中的所有源文件是危险的。

如果你是 onlinux,试试吧

qmake -project && qmake && make

在源目录中。QMake 将为您创建生成文件提供所有魔力。我相信,cmake 也会这样做。

最新更新