我正在尝试编写一个 makefile,假设我在目录 src/app/
中有 4 个源文件:
src/app/file1.cpp
src/app/file2.cpp
src/app/file3.cpp
src/app/file4.cpp
我想在另一个名为 obj/
的目录中创建不同的目标文件(即 file1.o
、file2.o
等) .在 makefile 中,我这样定义变量:
$(SRC) := $(wildcard src/app/*.cpp)
$(OBJ) := $(addprefix obj/,$(notdir $(SRC:.cpp=.o)))
我的命令是这样的:
all: $(OBJ)
$(OBJ): $(SRC)
$(CC) $(CFLAGS) -I/src/app/app.h -c $< -o $@
所以当我运行 make
时,我看到了这些操作:
g++ -g -Wall -I/src/app/app.h -c src/app/file1.cpp -o obj/file1.o
g++ -g -Wall -I/src/app/app.h -c src/app/file1.cpp -o obj/file2.o
g++ -g -Wall -I/src/app/app.h -c src/app/file1.cpp -o obj/file3.o
g++ -g -Wall -I/src/app/app.h -c src/app/file1.cpp -o obj/file4.o
你可以看到,目标文件有不同的名字,但源文件是一样的。我该如何解决?
请注意,我不能使用 %.o: %.cpp
,因为我的 makefile 中有其他目标用于不同的目的。
最佳答案
如果你不能使用
obj/%.o: src/app/%.cpp
那么第二种最简单的方法就是在最前面加上$(OBJ):
:
$(OBJ): obj/%.o: src/app/%.cpp
它被称为“静态模式规则”——在 GNU Make 手册中查找它。
关于c++ - makefile 一次又一次地为不同的对象选择相同的源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39433416/