Linux下C的通用Makefile与解析.doc_第1页
Linux下C的通用Makefile与解析.doc_第2页
Linux下C的通用Makefile与解析.doc_第3页
Linux下C的通用Makefile与解析.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux下C+的通用Makefile与解析# Generic makefile - 万能Makefile# for compiling and linking C+ projects on Linux # Author: George Foot Modified:Jackie Lee# Customising# Adjust the following if necessary; EXECUTABLE is the target# executables filename, and LIBS is a list of libraries to link in# (e.g. alleg, stdcx, iostr, etc). You can override these on makes# command line of course, if you prefer to do it that way.#EXECUTABLE := main # 可执行文件名LIBDIR:= # 静态库目录LIBS := # 静态库文件名INCLUDES:=. # 头文件目录SRCDIR:= # 除了当前目录外,其他的源代码文件目录# # Now alter any implicit rules variables if you like, e.g.:CC:=g+CFLAGS := -g -Wall -O3CPPFLAGS := $(CFLAGS)CPPFLAGS += $(addprefix -I,$(INCLUDES)CPPFLAGS += -MMD# # The next bit checks to see whether rm is in your djgpp bin# # directory; if not it uses del instead, but this can cause (harmless)# # File not found error messages. If you are not using DOS at all,# # set the variable to something which will unquestioningly remove# # files.#RM-F := rm -f# # You shouldnt need to change anything below this point.#SRCS := $(wildcard *.cpp) $(wildcard $(addsuffix /*.cpp, $(SRCDIR)OBJS := $(patsubst %.cpp,%.o,$(SRCS)DEPS := $(patsubst %.o,%.d,$(OBJS)MISSING_DEPS := $(filter-out $(wildcard $(DEPS),$(DEPS)MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.cpp,$(MISSING_DEPS).PHONY : all deps objs clean veryclean rebuild infoall: $(EXECUTABLE)deps : $(DEPS)objs : $(OBJS)clean : $(RM-F) *.o $(RM-F) *.dveryclean: clean $(RM-F) $(EXECUTABLE)rebuild: veryclean allifneq ($(MISSING_DEPS),)$(MISSING_DEPS) : $(RM-F) $(patsubst %.d,%.o,$)endif-include $(DEPS)$(EXECUTABLE) : $(OBJS) $(CC) -o $(EXECUTABLE) $(OBJS) $(addprefix -L,$(LIBDIR) $(addprefix -l,$(LIBS)info: echo $(SRCS) echo $(OBJS) echo $(DEPS) echo $(MISSING_DEPS) echo $(MISSING_DEPS_SOURCES)注:1)命令行前的空白符必须为一个制表符(Tab);如,$(RM-F) *.o前不是空格,而是一个制表符;内容解析1.Makefile基本语法target为要生成的目标文件;dependency为target的依赖文件;command为用于生成target的命令行; : .(tab)(tab) . . .2.赋值符号 := 与 = :=与=的区别在于,符号:=表示立即展开变量值。例如:A:=fooB:=$(A)A:=bar这时,B的值仍为foo,因为它已被展开,不会再随A的值改变而改变。3.符号#是Makefile的注释符号4.wildcard函数SRCS:=$(wildcard *.cpp) 表示列举当前目录中扩展名为.cpp的所有文件,然后赋值给变量SRCS。详细请google之。5.patsubst函数OBJS := $(patsubst %.cpp,%.o,$(SRCS)表示,将$(SRCS)中所有满足模式%.cpp的字符串替换为%.o。6.filter-out函数$(filter-out $(A),$(B)表示从B中过滤掉A中的内容,返回剩余内容;7. “.PHONY”用.PHONY修饰的target是“伪目标”,不需要生成真实的文件;make假定phony target是已经生成的,然后更新它后边的依赖文件和执行它下边的命令(command);8.all deps objs clean veryclean rebuild info这些都是“伪目标”。all是第一个目标,所以输入make时它被默认执行;all生成或更新所有*.cpp文件对应的*.d文件和*.o文件,并链接所有*.o文件生成可执行文件$(EXECUTABLE)。deps仅仅生成*.d文件;.d文件是什么文件?它包含了代码文件的依赖信息。objs仅仅生成*.o文件;.o文件是C+代码编译后的中间结果文件,废话!clean用于删除*.d文件和*.o文件。veryclean删除*.d文件、*.o文件,还有名为$(EXECUTABLE)的可执行文件。rebuild先调用veryclean清除结果文件,再调用all重新编译和链接。info查看某些信息。使用方法:make deps即可执行deps;9.ifneq.else.endif条件语句,ifneq表示如果不想等,则.;10.include 语句include表示把的内容包含进来;$(DEPS)是包含依赖信息的文件,每个源文件对应一个.d文件;-include $(DEPS)表示把这些依赖信息包含进来;11.链接*.o文件,生成可执行文件主菜来了!$(EXECUTABLE) : $(OBJS) $(CC) -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS)$(EXECUTABLE)为可执行文件名;$(OBJS)为所有.o文件名;$(CC)在这里是g+;$(addprefix -l,$(LIBS)添加引用库;前面说好的*.d文件和*.o文件是怎么生成的呢?貌似没有命令指出要生成它们呀!请看隐含规则!12. 隐含规则(Implicit rules)$(EXECUTABLE)依赖于$(OBJS),但makefile中没有指明$(OBJS)依赖于谁,也没指明命令生成它们;这时,make的隐含规则开始起作用;针对$(OBJS)中的每个目标,make自动调用:$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $依次生成.o文件和.d文件;$表示依赖文件列表的第一个文件名;$表示目标文件名;之所以会生成.d文件,是由于“-MMD”这

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论