【发布时间】:2013-05-24 20:42:06
【问题描述】:
我正在学习如何设置 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'.
【问题讨论】:
-
我认为您只是不希望在几个地方将
/附加到build。让我在这里试试。如果有帮助,您可以使用make -d查看make如何决定构建什么。 -
谢谢。然而,
make -d路由将需要一段时间,因为它会输出 927 行信息 :) -
您可以通过摆脱尽可能多的隐含规则来平息它。我只是在这里用一个简单的测试项目尝试了你的 makefile,它似乎按预期工作。也就是说,在第二次运行时,我只得到
make: Nothing to be done for 'all'.。 -
@CarlNorum 这似乎与 build/ 文件夹有关,请参阅我对 Q 的编辑
-
是的。我看到。答案如下。