我正在尝试在我的eclipse makefile项目的子目录中编写一个makefile。
MyProject \
test.cpp
Build\
Makefile
我也在尝试创建一个通用的makefile。我无法定义目标,因为构建不会发生在与源相同的目录中。
CC = g++
CC_FLAGS = -g3
EXEC = test
SOURCEDIR = ..
SOURCES = $(shell find $(SOURCEDIR) -name '*.c' -o -name '*.cpp')
OBJECTS = $(addsuffix .o,$(subst ../,,$(SOURCES)))
.DEFAULT_GOAL = all
$(EXEC): $(OBJECTS)
$(CC) $(OBJECTS) -o $(EXEC)
%.o: %.cpp
$(CC) -c $(CC_FLAGS) $< -o $@
.PHONY: clean
clean:
rm -f $(EXEC) $(OBJECTS)
.PHONY: all
all: $(EXEC)
现在,当我建立时,我得到错误......
make all
make: *** No rule to make target 'test.cpp.o', needed by 'test'. Stop.
任何人都可以告诉我为什么这不起作用或建议更好的方法。
答案 0 :(得分:1)
如果您将依赖项从对象更改为源,如下所示:
%.cpp.o: $(SOURCEDIR)/%.cpp
它似乎有效。
一般情况下,我宁愿不在构建目录中做任何事情,因为我个人希望构建目录是一个临时目录,可以完全删除以进行分发,如果Makefile在那里阻止则不是这种情况。但这是一个品味问题。
此外,我不想在make过程中使用您在对象/源中找到的所有c / cpp。如果您需要为项目中的不同变体添加文件,则输入一个噩梦以便稍后更改所有这些内容。
另外还有一个提示:通常对象是<basename>.o
而不是<basename>.cpp.o
还有一个:
用户希望clean
目标也删除可执行文件。如果没有,您只需执行make clean; make
即可看到重建,因为可执行文件已就绪并且所有依赖项都已完成。