Makefile在子目录中

时间:2017-06-26 10:13:25

标签: c++ makefile

我正在尝试在我的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.

任何人都可以告诉我为什么这不起作用或建议更好的方法。

1 个答案:

答案 0 :(得分:1)

如果您将依赖项从对象更改为源,如下所示:

 %.cpp.o: $(SOURCEDIR)/%.cpp
它似乎有效。

一般情况下,我宁愿不在构建目录中做任何事情,因为我个人希望构建目录是一个临时目录,可以完全删除以进行分发,如果Makefile在那里阻止则不是这种情况。但这是一个品味问题。

此外,我不想在make过程中使用您在对象/源中找到的所有c / cpp。如果您需要为项目中的不同变体添加文件,则输入一个噩梦以便稍后更改所有这些内容。

另外还有一个提示:通常对象是<basename>.o而不是<basename>.cpp.o

还有一个: 用户希望clean目标也删除可执行文件。如果没有,您只需执行make clean; make即可看到重建,因为可执行文件已就绪并且所有依赖项都已完成。