我正在学习如何设置makefile,并遇到了问题。为了证明这一点,我创建了一个由源文件组成的简单“项目” main.m
和 test.m
。
我正在尝试设置make来编译这些文件(仅在某些事情发生变化时),并将目标文件存储在其他地方(这里) build/
)
我的Makefile:
OBJ = ./build
SOURCES=main.m test.m
OBJECTS=$(addprefix $(OBJ)/,$(SOURCES:.m=.o))
EXECUTABLE=test
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
gcc $(OBJECTS) -o $(EXECUTABLE)
$(OBJECTS): $(OBJ)/%.o: %.m build/
gcc -c $< -o $@
build/:
mkdir build
当我第一次运行它时(只有Makefile和当前目录中的源代码)它会按照我的预期执行:
gcc -c main.m -o build/main.o
gcc -c test.m -o build/test.o
gcc ./build/main.o ./build/test.o -o test
但是,如果我跑 make
再次:
gcc -c main.m -o build/main.o
gcc ./build/main.o ./build/test.o -o test
我做错了什么?还要注意Makefile中的任何其他错误,因为我正在努力学习创建“好”的Makefile。
编辑:
我发现了什么 make -d
:
Finished prerequisites of target file `build/main.o'.
Prerequisite `main.m' is older than target `build/main.o'.
Prerequisite `build/' is older than target `build/main.o'.
No need to remake target `build/main.o'.
和
Finished prerequisites of target file `build/test.o'.
Prerequisite `test.m' is older than target `build/test.o'.
Prerequisite `build/' is newer than target `build/test.o'.
Must remake target `build/test.o'.