我的makefile工作正常(GNU Make),但我想知道是否
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 :(得分: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也会这样做。