一、文件配置目录
1)原目录
demo
├── Makefile
├── demo.cpp
├── demo.hpp
└── main.cpp
2)make之后的目录
demo
├── Makefile
├── demo.cpp
├── demo.hpp
├── demo.o
├── main.cpp
├── main.o
└── target
二、 a setup for makefile
objects = main.o demo.o #定义一个变量 target: $(objects) #最终目标文件及其依赖的文件和生成方式 clang++ -std=c++11 $(objects) -g -o target #生成命令 main.o: demo.hpp #中间文件及其依赖文件和生成方式 clang++ -std=c++11 main.cpp -g -c -o main.o #生成命令 demo.o: demo.hpp #中间文件及其依赖文件和生成方式 clang++ -std=c++11 demo.cpp -g -c -o demo.o #生成命令 clean: #伪中间文件,既动作 rm -rf target $(objects) #清楚编译链接所产生的文件
注:对于中间文件的依赖文件,我们可以利用make的自动推导功能,只制定自定义依赖的头文件即可;对于中间文件的生成方式,由于默认的生成方式存在问题,我们需要制定。
三、more
1)对于大型的project,我们可以新建一个src目录,将各个模块的源文件放在其下
2)对于编译产生的中间文件,我们可以新建一个build目录,并将其置于其下
3)对于产生的最终目标文件,我们可以新建一个bin目录,并将其置于其下
4)对于编译链接,我们可以采用范性编程的思想,利用find和patsubst等命令来构造sources和objects等变量
如下:
#FoldersSRCDIR := srcBUILDDIR := buildTARGETDIR := bin#targetEXECUTABLE := targetTRAGET = $(TARGETDIR)/$(EXECUTABLE)#code listsSRCEXT := cppSOURCES := $(shell find $(SRCDIR) -type f -name "*.$(SRCEXT)")OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))$(TRAGET): $(OBJECTS) @mkdir -p $(TARGETDIR) @clang++ -std=c++11 $^ -g -o $(TRAGET) $(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) @mkdir -p $(BUILDDIR) @clang++ -std=c++11 -c -o $@ $
demo
├── Makefile
├── bin
│ └── target
├── build
│ ├── demo.o
│ └── main.o
└── src
├── demo.cpp
├── demo.hpp
└── main.cpp