0

我的 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)
4

3 回答 3

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
于 2012-09-16T18:31:21.173 回答
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箱

# Link rule
$(EXEC): $(OBJ)
  $(CC) $(CFLAGS) $(OBJ) -o $(EXEC)

all: $(EXEC)

clean:
   rm -rf bin $(EXEC)
于 2012-09-16T18:50:28.777 回答
0

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

如果你是onlinux,试试简单

qmake -project && qmake && make

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

于 2012-09-16T18:33:01.870 回答