MAKEFILE简单介绍
! U# M) n. Q" A0 H[]什么是make?
9 y4 H/ x& b5 U. F5 b
9 v& r9 X4 e1 ~3 y Unix(Linux)是一个天生的开发平台,make是一个强力的工具.它能
7 `2 C- Y# ?! S9 f1 \5 x* e
自动跟踪相互依赖的源代码块并组成一程序,使得很容易建立一可执行程序.Make就是这种有依赖关系的部分和代码之间所作的规格说明.
% X% G& c. \# S8 l) F1 I# R- l5 c3 W: q
+ h4 A- R, z7 N; e y% G0 T/ b
[] 所有的程序都要使用make?
0 A, a0 p9 Q, N, {) K 是的.尽管你只有几个简单的模块,但你需要有一种结构来支持它从简单走向复杂.除非你的程序已经盖棺定论.
& ^# ^6 k; m. s7 F I$ S$ l
; D( g* `' k0 Q8 y" A# o" q
[]Makefile由哪些组成?
& b3 X" w8 x' d7 @, X Makefile由以下几个部分组成:
) n0 ^2 p2 W7 \' z- ~: F, m, k
5 W3 R: k4 N) g2 H1 G* @ 注释.
# C) S" q2 g& A) |3 v+ y; { ^^^^
4 z V7 m. D3 G 使用#符号插入.make将忽略#之后的任何内容以及其后的RETURN键.
% G7 S v/ D- ]* o0 c2 \
( ~1 y6 u# b1 u$ o 变量.
4 f! |" }, F: {" ]# N5 l. G: S
^^^^
: P2 y- [1 _7 ~. I+ d make允许定义与SHELL变量类似的有名变量.比如,你定义了SOURCES=prog.c,那么该
3 g7 i# W' z9 b; N0 @$ Z; X2 u
变量的值$(SCOURES)就包含了源文件名.
! P* p0 N% p2 \( {! a' V2 {
, |/ G% r* f6 E5 l7 c& @6 M6 a$ ^ 依赖关系.
$ k. k% ^# d- `. I# b
^^^^^^^^
9 n) ^, ^4 U; N/ Z. v 左边是目标模块,后接一冒号.再接与该模块有依赖关系的模块.
9 Z V3 H4 W, w; V
% C* a: S3 D" x% I0 s/ j7 }' m
命令.
! Z0 e& E- o" Q& q& B/ R ^^^^
2 o8 n [2 y/ s+ O 以TAB键开始(即使用相同数量的空格也不能代替它).
: d7 J x) p$ ?: |! U# O8 v, f, _7 b! o" o$ U. p N
- a, ]7 T0 a, m8 }[]Makefile示例
8 T) G) N+ L6 E/ u" N 下面介绍一个简单的示例来说明make的用法.假设你的程序有两个源文件main.c和my
! P# u' g1 m$ X8 V1 U" D, v
c.c,一个位於子目录include下的头文件myhead.h,一个库由三个源文件myrout1.c,myrou
: ?$ T( T+ B7 w% J% v$ ht2.c,myrout3.c产生.
# p3 O: m4 i4 o0 B 其makefile文件为:
/ P/ m6 y9 B, X6 T[CODE]
4 i9 a! o0 [* F; C& i& w #一个基本的MAKEFILE文件.
5 ?5 x( X( T: s s3 S #其中包括个人的头文件和个人库.
& I' S; k( s9 B4 I HEADERS=include/myhead.h
. ?: v/ _" t5 W+ o$ `
SOURCES=main.c myc.c
: [; |7 w8 r2 z! K* g% c2 z2 s9 L
PRODUCT=$(HOME)/bin/tool
1 Z" l& }5 |8 l* C/ M, u LIB=myrout.a
6 E2 |! k/ @. k5 U F7 g i' M8 K
LIBSOURES=myrout1.c myrout2.c myrout3.c
) ^" E: P1 f- {8 G5 J
CC=cc
' I5 r3 ?" ?4 b% N" K& s CFLAGS=-g
% t6 e% w4 Z; ?7 } all

(PRODUCT)
$ t% U" J. }' M5 p% ]2 S $(PRODUCT)

(SOURCES)
4 {8 Q% y$ K6 {) l. k& B7 F $(CC)$(CFLAGS) -o $(PRODUCT)$(SOURCES)
9 M5 U8 Z. l' u( }6 a lint

(PRODUCT)
: s& C6 R* p3 G+ V, u" B lint $(SOURCES)$(LIBSOURCES)[/CODE]
, I: z( c- t1 }, }7 ]
哈哈,挺象SHELL编程的.如果你与我一样使用LINUX下的gcc,那么只要把上面的CC=cc改为CC=gcc即可.怎么样,想来一个更复杂点的吗?
7 b) V$ @6 H+ s% C) G1 S
6 [9 c" S- R3 L! ^% a3 K$ d c[]一个更为复杂的Makefile
4 m4 s* n4 X' }' _1 j" J" G 你是否注意到,在上例中,只要启动make,就会重新编译所有源代码.
( T, D" ~+ y% _5 R# H0 ? 如果你能看懂以下的makefile,恭喜恭喜,你通关了.
3 M$ ]! m+ I$ K% E$ ]8 \[CODE]
1 V: }! m; c: Y- W" ~) C
#一个更为复杂的makefile
O% p. G5 w# S- i# D5 W9 H
HEADERS=include/myhead.h
- T. I" D1 R; Y! V+ [; u
SOURES=main.c myc.c
9 ?6 J- W& R( K; L' ]
OBJECTS=main.c myc.c
% b7 a* x1 n" m PRODUCT=$(HOME)/bin/tool
9 v2 H6 @9 H& W
LIB=myrout.a
7 m& q: a* C( x( | LIBSOURCES=myrout1.c myrout2.c myrout3.c
: M' w- M* k: s& m0 m) m LIBOBJECTS=$(LIB)(myrout1.o)$(LIB)(myrout2.o)$(LIB)(myrout3.o)
& \# W; E& h) |! {1 |7 Q5 S5 Y
INCLUDE=include
- v# @$ e& U1 R0 v$ Q2 w CC=cc
; g9 |9 H! a$ m4 r& w
CFLAGS=-g -Xc
# Z& L1 m" s e4 B8 ]/ `! Z LINT=lint
( x& p( a% i3 X) H6 L8 X- j
LINTFLAGS=-Xc
7 D8 @5 h1 L# ^* p/ {3 w
all

(PRODUCT)
+ ]8 U5 F& I5 }* x" q# k
$(PRODUCT):$(OBJECTS)$(LIB)
. d; u2 s+ K$ `( ^( {& S7 V# o) ^
$(CC)(CFLAGS)-o$(PRODUCT)$(OBJECTS)$(LIB)
7 D# [0 v& _' p# M" @
.c.o: $(HEADERS)
0 f/ B4 X; A4 c $(CC)$(CFLAGS) -c I$(INCLUDE)$<
! b7 t I! _0 G. Q $(LIB):$(HEADERS)$(LIBSOURCES)
0 F9 e5 i3 v2 U0 s& m $(CC) $(CFLAGS) -c $(?:.o=.c)
8 ^: S- _ R5 F ar rv $(LIB) $?
" z6 u# @% p: n, E( q
rm $?
0 B! ^+ [* y( O5 o
.c.c:;
$ J: n. i3 H ^7 a, K# u7 E lint: $(PRODUCT)
3 F9 Z/ u, R0 x3 V' k $(LINT)$(LINIFLAGS)$(SOURCES)$LIBSOURCES)[/CODE]