实现的功能:
make——编译和连接程序。
make objs——编译程序,生成目标文件。
make clean——清除编译产生的目标文件(*.o)和依赖文件(*.d)
make cleanall——清除目标文件(*.o)、依赖文件(*.d)和可执行文件(*.exe)
make rebuild——重新编译连接程序,相当于make clean &&make
usage:
makefile源**。
# gneric c/c++ makefile
program :=
srcdirs :=
srcexts :=
cppflags :=
cflags :=
cflags +=
cxxflags :=
cxxflags +=
ldflags :=
ldflags +=
shell = bin/sh
sources = foreach d,$(srcdirs),$wildcard $(addprefix $(d)/*srcexts)))
objs = foreach x,$(srcexts),\
(patsubst %$x),%o,$(filter %$x),$sources)))
deps = patsubst %.o,%.d,$(objs))
phony: all objs clean cleanall rebuild
all : program)
.d : c
$(cc) -mm -md $(cflags) lt;
.d : c
$(cc) -mm -md $(cxxflags) lt;
objs : objs)
.o : c
(cc) -c $(cppflags) $cflags) lt;
.o : cpp
(cxx) -c $(cppflags) $cxxflags) lt;
(program) :objs)
ifeq ($strip $(srcexts)),c)
(cc) -o $(program) $objs) $ldflags)
else(cxx) -o $(program) $objs) $ldflags)
endifinclude $(deps)
rebuild: clean call
clean:
$(rm) *o *.d
cleanall: clean
$(rm) $program) $program).exe
2 通用makefile——2
##genericmakefileforc/c++program
##author:whyglinux(whyglinuxathotmaildotcom)
#date:2006/03/04
#description:
#themakefilesearchesindirectoriesforthesourcefiles
#withextensionsspecifiedin,thencompilesthesources
#andfinallyproducesthe,theexecutablefile,bylinking
#theobjectives.
#usage:
#$makecompileandlinktheprogram.
#$makeobjscompileonly(
#$makecleancleantheobjectivesanddependencies.
#$makecleanallcleantheobjectives,dependenciesandexecutable.
###customizingsection:adjustthefollowingifnecessary.
#theexecutablefilename.
#itmustbespecified.
#program:=
program:=
#thedirectoriesinwhichsourcefilesreside.
#atleastonepathshouldbespecified.
#srcdirs:=.#currentdirectory
srcdirs:=
#thesourcefiletypes(headersexcluded).
#atleastonetypeshouldbespecified.
##srcexts:=.c#cprogram
#srcexts:=.cpp#c++program
#srcexts:=.
srcexts:=
#theflagsusedbythecpp(mancppformore).
#cppflags:=-wall-werror#showallwarningsandtakethemaserrors
cppflags:=
#thecompilingflagsusedonlyforc.
#ifitisac++program,noneedtosettheseflags.
#ifitisacandc++mergingprogram,settheseflagsforthecparts.
cflags:=
cflags+=
#thecompilingflagsusedonlyforc++.
#ifitisacprogram,noneedtosettheseflags.
#ifitisacandc++mergingprogram,settheseflagsforthec++parts.
cxxflags:=
cxxflags+=
#thelibraryandthelinkoptions(candc++common).
ldflags:=
ldflags+=
##implictsection:changethefollowingonlywhennecessary.
##cc=gcc
#thec++
#cxx=g++
#uncommentthe2linestocompilecprogramsasc++ones.
#cc=$(cxx)
#cflags=$(cxxflags)
#thecommandusedtodeletefile.
#rm=rm-f
##shell=/bin/sh
sources=$(foreachd,$(srcdirs),$wildcard$(addprefix$(d)/*srcexts)))
objs=$(foreachx,$(srcexts),\
(patsubst%$(x),%o,$(filter%$(x),$sources)))
deps=$(patsubst%.o,%.d,$(objs))
phony:allobjscleancleanallrebuild
all:$(program)
#rulesforcreatingthedependencyfiles(.d).
.d:%.c
@$(cc)-mm-md$(cflags)$<
.d:%.c
@$(cc)-mm-md$(cxxflags)$<
.d:%.cc
@$(cc)-mm-md$(cxxflags)$<
.d:%.cpp
@$(cc)-mm-md$(cxxflags)$<
.d:%.cpp
@$(cc)-mm-md$(cxxflags)$<
.d:%.c++
@$(cc)-mm-md$(cxxflags)$<
.d:%.cp
@$(cc)-mm-md$(cxxflags)$<
.d:%.cxx
@$(cc)-mm-md$(cxxflags)$<
#rulesforproducingtheobjects.
objs:$(objs)
.o:%.c
$(cc)-c$(cppflags)$(cflags)$<
.o:%.c
$(cxx)-c$(cppflags)$(cxxflags)$<
.o:%.cc
$(cxx)-c$(cppflags)$(cxxflags)$<
.o:%.cpp
$(cxx)-c$(cppflags)$(cxxflags)$<
.o:%.cpp
$(cxx)-c$(cppflags)$(cxxflags)$<
.o:%.c++
$(cxx-c$(cppflags)$(cxxflags)$<
.o:%.cp
$(cxx)-c$(cppflags)$(cxxflags)$<
.o:%.cxx
$(cxx)-c$(cppflags)$(cxxflags)$<
#rulesforproducingtheexecutable.
(program):$objs)
ifeq($(strip$(srcexts)),c)#cfile
$(cc)-o$(program)$(objs)$(ldflags)
else#c++file
$(cxx)-o$(program)$(objs)$(ldflags)
endifinclude$(deps)
rebuild:cleanall
clean:
@$(rm)*.o*.d
cleanall:clean
@$(rm)$(program)$(program).exe
下面提供两个例子来具体说明上面makefile的用法。
例一 helloworld程序。
这个程序的功能是输出hello,world!这样一行文字。由三个文件组成。前两个文件是c程序,后一个是c++程序,因此这是一个c和c++混编程序。
cheaderfile
#ifndefhello_h
#definehello_h
#ifdef__cplusplus
extern"c"{
#endif
voidprint_hello();
#ifdef__cplusplus
#endif
#endif
csourcefile.
#include""
#include<>
voidprint_hello()
puts("hello,world!")
c++sourcefile.
#include""
intmain()
print_hello();
return0;
建立一个新的目录,然后把这三个文件拷贝到目录中,也把makefile文件拷贝到目录中。之后,对makefile的相关项目进行如下设置:
program:=hello#设置运行程序名。
srcdirs:=.#源程序位于当前目录下。
srcexts:=.源程序文件有。c和。cxx两种类型。
cflags:=-g#为c目标程序包含gdb可用的调试信息。
cxxflags:=-g#为c++目标程序包含gdb可用的调试信息。
由于这个简单的程序只使用了c标准库的函数(puts),所以对于cflags和cxxflags没有过多的要求,ldflags和cppflags选项也无需设置。
经过上面的设置之后,执行make命令就可以编译程序了。如果没有错误出现的话,./hello就可以运行程序了。
如果修改了源程序的话,可以看到只有和修改有关的源文件被编译。也可以再为程序添加新的源文件,只要它们的扩展名是已经在makefile中设置过的,那么就没有必要修改 makefile。
例二 gtk+版helloworld程序。
这个gtk+2.0版的helloworld程序可以从下面的**上得到:当然,要编译gtk+程序,还需要你的系统上已经安装好了gtk+。
跟第一个例子一样,单独创建一个新的目录,把上面网页中提供的程序保存为文件。对makefile做如下设置:
program:=hello#设置运行程序名。
srcdirs:=.#源程序位于当前目录下。
srcexts:=.c#源程序文件只有。c一种类型。
cflags:=`pkg-config--cflagsgtk+-2.0`#cflags
ldflags:=`pkg-config--libsgtk+-2.0`#ldflags
这是一个c程序,所以cxxflags没有必要设置——即使被设置了也不会被使用。
编译和连接gtk+库所需要的cflags和ldflags由pkg-config程序自动产生。
现在就可以运行make命令编译、./hello执行这个gtk+程序了。
3 通用makefile——3
# 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
# executable's filename, and libs is a list of libraries to link in
# ( alleg, stdcx, iostr, etc). you can override these on make's
# 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,
cc:=g++
cflags :=g -wall -o3
cppflags :=cflags)
cppflags +=addprefix -i,$(includes))
教学实例及分析作业
其中 习作教学的案例 给我的帮助最大 传统的作文教学,大多是命题或是半命题的作文,其内容老化 枯燥 脱离生活。所以作文一般拘泥于课本,从句式到文章结构,模仿的居多,雷同的居多。在传统课堂上,写作被限制在课堂里,百分之百属于课堂教学。学生在课堂上的写作过程大体上可以分为两个阶段 一是思维阶段,包括审题...
读后感技巧及实例
目送龙应台读后感 关于目送。我慢慢地 慢慢地了解到,所谓父女母 子一场,只不过意味着,你和他的缘分就是今生今世不断地在目送他的背影渐行渐远。你站在小路的这一端,看着他逐渐消失在小路转弯的地方,而且,他用背影告诉你 不必追。这是写在书的封底的话,也是我看这本书的初衷。不喜欢离别,更不用说目送,无论是送...
怎么写述职报告及实例
一 如何写述职报告。一 个人述职报告的写作格式及技巧 二 述职报告的作用及内容 三 述职报告的写作注意事项。四 述职报告的写作要领 二 述职报告实例。一 大学教师的述职报告。二 长述职报告。三 办公室副主任200x年述职报告。四 工程公司经理的述职报告。五 某司法局长的述职报告。六 教育系统年度述职...