通用Makefile的目的有:
一,基本功能
1、一个源文件修改了,则只编译该源文件一次,再链接就可以了
2、一个头文件修改了,则必须编译该头文件对应的其他的源文件
3、头文件和源文件的增加和减少都不需要修改Makefile
二,中级功能
只是,我只实现了基本功能。1、可以设置文件的编译选项
2、可以设置源文件目录,执行文件目录,makefile目录等
3、支持跨平台
用法是将其放入到项目文件的根目录,命名为Makefile ,输入make即可编译。
其会找到该目录下的.cpp文件
然后生成其依赖文件,然后建立Makefile。
CC := g++
CPPFLAGS := -g
ALL := $(wildcard *.cpp)
OBJ := $(ALL:.cpp=.o)
OBD := $(ALL:.cpp=.d)
result : $(OBJ)
$(CC) $(CPPFLAGS) -o result $(OBJ)
include $(OBD)
%.d : %.cpp
@set -e; \
rm -f $@; \
$(CC) -MM {1}lt; > $@.temp ;\
sed 's,\(.*\).o: \(.*\),\1.o: \2\n $(CC) -c $(CPPFLAGS) \2 ,' < $@.temp > $@;\
rm -f $@.temp
.PHONY:clean
clean:
-rm -f *.temp *.d *.o *.gch result
以下是更新版的Makefile,可以设置目标文件的目录,源文件目录,和可执行文件的目录与名字。
但仍然不支持源文件分散在子目录下面。
CC := g++
CPPFLAGS := -g
SOURCEDIR := ../sourcefiles
TEMPDIR := ../tempfiles
EXENAME := ../result
OBC := $(wildcard $(SOURCEDIR)/*.cpp)
ALL := $(patsubst $(SOURCEDIR)/%.cpp,%.cpp,$(OBC))
OBJ := $(patsubst %,$(TEMPDIR)/%,$(ALL:.cpp=.o))
OBD := $(patsubst %,$(TEMPDIR)/%,$(ALL:.cpp=.d))
$(EXENAME) : $(OBJ)
$(CC) -o $(EXENAME) $(OBJ)
include $(OBD)
$(TEMPDIR)/%.d :$(SOURCEDIR)/%.cpp
@set -e; \
rm -f $@; \
$(CC) -MM {1}lt; > $@.temp2 ;\
tr '\\\n' ' ' < $@.temp2 >$@.temp;\
sed 's,\(.*\).o: \(.*\),$(TEMPDIR)/\1.o: \2\n $(CC) -c $(CPPFLAGS) $(SOURCEDIR)/\1.cpp -o $(TEMPDIR)/$*.o,' < $@.temp > $@;\
rm -f $@.temp2 $@.temp
.PHONY:clean
clean:
-rm -f $(TEMPDIR)/* $(EXENAME)