使用Makefile修改项目组织

时间:2016-05-23 10:02:16

标签: c++ makefile

我创建了一个我最初认为简单的项目(少量文件),但现在项目正在增长。我试图重新组织目录结构,但我不确定如何修改makefile。

这是我的结构:

root_dir
  Makefile
  main.cc
  fileA.cc
  fileA.h
  fileB.cc
  fileB.h

fileB依赖于fileA(#include "fileA.h"),我的Makefile如下所示:

all: myExec

myExec: main.o fileA.o fileB.o
     g++ -Wall main.o fileA.o fileB.o -o myExec

main.o: main.cc fileA.h fileB.h
     g++ -Wall -c main.cc

fileA.o: fileA.cc fileA.h
     g++ -Wall -c fileA.cc

fileB.o: fileB.cc fileB.h fileA.h
     g++ -Wall -c fileB.cc

现在我想要有类似的东西:

root_dir
  Makefile
  main.cc
  dirA
    fileA.cc
    fileA.h
  dirB
     fileB.cc
     fileB.h

我读到我可以在每个子目录中创建一个Makefile,但我不确定这是否可行,因为fileB依赖于fileA(位于另一个子目录中)。

或者我应该修改我的主Makefile以包含subdir?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您坚持使用单个makefile,它与您正在做的事情没有什么不同,您只需要正确设置包含标志即可。由于make的内置规则,您的makefile也可以大大简化,并且使用GCC的依赖关系生成标记,您不需要手动添加标题。

N.b。将main.cc更改为myExec.cc,它更直观的IMO,并允许您跳过链接配方。

srcs := $(wildcard dirA/*.cc dirB/*.cc)
objs := $(srcs:.cc=.o) myExec.o
deps := $(objs:.o=.d)

CPPFLAGS := -MMD -MP

myExec: CC := $(CXX)
myExec: $(objs)
myExec.o: CPPFLAGS += -IdirA -IdirB
dirA/%.o: CPPFLAGS += -IdirB

.PHONY: clean
clean: ; $(RM) $(objs) $(deps) myExec

-include $(deps)

也就是说,很难看出用这样一个人为的例子将你的项目分成多个目录的优势是什么。