通用Makefile及实例

发布 2021-03-18 09:54:28 阅读 3369

实现的功能:

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年述职报告。四 工程公司经理的述职报告。五 某司法局长的述职报告。六 教育系统年度述职...