我正在努力使*.o文件保留在/bin中,但在运行它之后,*.o文件就不会保留了。
我的文件系统如下:
> bin
> src
*.cpp
> headers
*.h
makefile
CC := g++
CFLAGS := -Isrc/headers
NAME := run
SRC := src/
HSRC := $(SRC)/headers/
OBJ := bin/
SOURCES := $(wildcard $(SRC)*.cpp)
DEPS = $(wildcard $(HSRC)*.h)
OBJECTS := $(patsubst $(SRC)*.cpp,$(OBJ)*.o,$(SOURCES))
$(OBJ)/%.o: %.cpp $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
$(NAME): $(OBJECTS)
$(CC) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f $(NAME) $(OBJ)/*.o *~ core $(INCDIR)/*~
您的主要高级问题是,在开发makefile时没有测试它,所以在您知道它们存在之前,错误就堆积起来了。
第一个具体问题是,您对OBJECTS
的分配是不正确的,并且没有按照您认为的方式工作。patsubst
函数使用%
,而不是*
,因此它应该是:
OBJECTS := $(patsubst $(SRC)%.cpp,$(OBJ)%.o,$(SOURCES))
第二个原因是您还没有决定OBJ
是否应该包含一个试验斜杠。不应该,但这不是重点;关键是你必须始终如一。看这里:
OBJ := bin/
...
$(OBJ)/%.o: %.cpp $(DEPS)
...
看到问题了吗?您已经编写了一个匹配bin//foo.o
但不匹配bin/foo.o
的规则,所以Make永远不会调用它。我们必须选择其中一个约定;为了这个答案的目的,我将选择这个:
OBJ := bin
第三,当您编写该规则时,您似乎忽略了一个事实,即您将源文件放在自己的目录中,因此我们必须修改它:
$(OBJ)/%.o: $(SRC)%.cpp $(DEPS)
还有一些改进的空间,但这会奏效的。