使“Makefile”看起来更好

时间:2012-09-16 18:25:02

标签: c++ makefile bin

我的makefile工作正常(GNU Make),但我想知道是否

  • 有一种方法可以创建一个新目录“bin”并将所有.o放在那里
  • 如果“1”的答案为“是”,指令“make clean”可以删除文件夹“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)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

从这些来源而不是通过某些中间产品(如.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 :(得分:0)

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

如果你是onlinux,那就试试吧

qmake -project && qmake && make

在源目录中。 QMake将为您创建makefile的所有魔力。我相信,cmake也会这样做。