我的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 也会这样做。