MAKEFILE简单介绍
7 e- V4 k, H( W# g( r& H[]什么是make?
7 g' s! k7 g& u: A# j! w- @2 e0 _ D. V; ~( o0 }
Unix(Linux)是一个天生的开发平台,make是一个强力的工具.它能
j' [1 c; d% r c+ G) w
自动跟踪相互依赖的源代码块并组成一程序,使得很容易建立一可执行程序.Make就是这种有依赖关系的部分和代码之间所作的规格说明.
4 g. R5 Z4 E, b% Q8 s6 {9 j" g& p5 @4 j6 V3 k% V0 X- j. Z
[] 所有的程序都要使用make?
1 W) l! O2 r1 |$ x; m9 _$ F 是的.尽管你只有几个简单的模块,但你需要有一种结构来支持它从简单走向复杂.除非你的程序已经盖棺定论.
6 t) R. t8 T6 W' r: @! o
/ b- A: i6 P. A1 t[]Makefile由哪些组成?
1 O' ?( C @# y8 x+ c$ o Makefile由以下几个部分组成:
- X" ?; N4 j: }- e0 W
8 s8 ~6 y) E) j$ c$ h5 g# j 注释.
' b) o' X9 Q( r) C1 L. `& m ^^^^
& _$ `! h# ?) O 使用#符号插入.make将忽略#之后的任何内容以及其后的RETURN键.
3 K: c# ^5 n. v T/ {
* l7 F3 {" K. t& p, m( W _* o 变量.
3 O4 J6 o6 { g; M. w
^^^^
. B B( O) r- q. v make允许定义与SHELL变量类似的有名变量.比如,你定义了SOURCES=prog.c,那么该
3 Q7 w! U& Y# W) K- i& F
变量的值$(SCOURES)就包含了源文件名.
; Z" b) K) b& `# H( @4 {# c8 Q3 Z4 T1 I# ]2 \
依赖关系.
2 s0 @% x; u' [+ F ^^^^^^^^
4 ?- {' S9 {8 {& U. M 左边是目标模块,后接一冒号.再接与该模块有依赖关系的模块.
1 }4 L3 O" l' @ X2 A
3 R% n0 @! {# Z j9 @, r 命令.
8 o0 u, W- I T, S% A" F9 D* p ^^^^
5 I2 d- x& N4 H& t
以TAB键开始(即使用相同数量的空格也不能代替它).
" s, C- O# Y$ i# v7 k7 x: s# c5 Q+ e; b9 g! z
9 u+ o# l; v: F! U4 f& G
[]Makefile示例
/ e( [0 U" l2 Q& V4 b2 R( x0 F
下面介绍一个简单的示例来说明make的用法.假设你的程序有两个源文件main.c和my
! x k) ?- J4 x8 _6 y
c.c,一个位於子目录include下的头文件myhead.h,一个库由三个源文件myrout1.c,myrou
1 Y3 J9 Y: Z5 g
t2.c,myrout3.c产生.
& I3 g0 `" L. I* i n4 T 其makefile文件为:
+ s3 t" s2 Y5 B8 ?' ?
[CODE]
# F& j- A6 v# m4 n2 N- f% e
#一个基本的MAKEFILE文件.
+ A, E! V( |( r# H8 k0 I
#其中包括个人的头文件和个人库.
' C+ B# i [( u$ ?/ F
HEADERS=include/myhead.h
& Y- `9 B p- s. L T/ m
SOURCES=main.c myc.c
/ N* Y0 W: D8 R9 M
PRODUCT=$(HOME)/bin/tool
/ ]0 f3 z! k) Q" t
LIB=myrout.a
7 l4 Y L; l) h2 o) D! u
LIBSOURES=myrout1.c myrout2.c myrout3.c
+ u; \1 o$ P9 J1 y; q% `" |
CC=cc
6 S4 I/ t0 Z; j/ u3 W CFLAGS=-g
6 p4 p- s( K; X; R; D
all

(PRODUCT)
. |# p+ J+ ?7 n# Q c$ Q $(PRODUCT)

(SOURCES)
# y; N6 d8 p1 q $(CC)$(CFLAGS) -o $(PRODUCT)$(SOURCES)
. Y2 z- l9 g* R# _; e
lint

(PRODUCT)
* w" G, K" }$ r4 T% B2 m6 B
lint $(SOURCES)$(LIBSOURCES)[/CODE]
q0 x! b6 ~& r 哈哈,挺象SHELL编程的.如果你与我一样使用LINUX下的gcc,那么只要把上面的CC=cc改为CC=gcc即可.怎么样,想来一个更复杂点的吗?
# v1 x/ H/ Q- T0 E3 h0 n2 ^( H7 M9 L9 i$ M$ N& @; E" \
[]一个更为复杂的Makefile
# b) d4 _3 S+ r$ P
你是否注意到,在上例中,只要启动make,就会重新编译所有源代码.
5 ~7 F C* Y- L8 _/ l' u' ^ 如果你能看懂以下的makefile,恭喜恭喜,你通关了.
) ?$ h% S& E! ]4 C, L( i5 G
[CODE]
! N4 w! v9 {8 f5 `
#一个更为复杂的makefile
0 U1 {- _3 A/ K% ~) z* h HEADERS=include/myhead.h
5 o7 g/ x1 C/ p+ J: K4 c2 ^* t4 ^. L SOURES=main.c myc.c
" ^7 Z9 T; n( j, l! b3 o
OBJECTS=main.c myc.c
2 M$ p# C' d1 y* ^1 [) b
PRODUCT=$(HOME)/bin/tool
# ~0 t% E# l5 S; A LIB=myrout.a
+ i+ [; v' v! U' f/ f/ s
LIBSOURCES=myrout1.c myrout2.c myrout3.c
+ {/ {1 H, f4 T LIBOBJECTS=$(LIB)(myrout1.o)$(LIB)(myrout2.o)$(LIB)(myrout3.o)
2 l f/ [% z8 S# E5 O2 [5 s: N
INCLUDE=include
- y7 ^2 W1 U' g1 I) c. N
CC=cc
# w6 F' v' Z1 T0 z+ u' W- _
CFLAGS=-g -Xc
( G: B! ]' `- q# |# `) S! H# p/ U
LINT=lint
$ ]5 K' [% U. `# ]* p LINTFLAGS=-Xc
. O" Z2 D Y0 U8 t2 B
all

(PRODUCT)
% ?2 z+ z/ q Y$ Q5 J $(PRODUCT):$(OBJECTS)$(LIB)
: z0 C- Z6 @) ]/ _) U
$(CC)(CFLAGS)-o$(PRODUCT)$(OBJECTS)$(LIB)
' `0 b0 t3 x, n7 U- T4 X$ }3 N& Y
.c.o: $(HEADERS)
4 X$ K- a* c; j6 i2 b' K
$(CC)$(CFLAGS) -c I$(INCLUDE)$<
0 ^( c" t3 W4 u7 F2 [6 H $(LIB):$(HEADERS)$(LIBSOURCES)
q- b7 H' [0 Q' Q. w; X
$(CC) $(CFLAGS) -c $(?:.o=.c)
- P; i. D7 A8 F( Q9 w5 ^: T
ar rv $(LIB) $?
. l7 m4 Z8 S1 i( ], G- C rm $?
6 u3 N2 {* r1 c' N# `' g
.c.c:;
: f4 Z, d6 d* f* { lint: $(PRODUCT)
8 U/ E7 t" e: o5 q, [# \ $(LINT)$(LINIFLAGS)$(SOURCES)$LIBSOURCES)[/CODE]