Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137268
  • 博文数量: 35
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-09 12:22
个人简介

http://www.76ku.cn

文章分类

全部博文(35)

文章存档

2011年(1)

2010年(17)

2007年(17)

我的朋友

分类: LINUX

2007-07-18 01:18:12

1.一个简单的makefile例子
 
假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生成file可执行文件
 
file:file1.o file2.o                  附属行(文件的依存关系)
    gcc -o file1.o file2.o            命令行
file1.o:file1.c head.h
    gcc -c file1.c
file2.o:file2.c head.h
    gcc -c file2.c
 
从file最终的目标文件开始倒推,依次列出文件的依存关系,make在执行时:
 
(1)判断file可执行文件是否存在,若不存在,则执行命令行,向下寻找依存关系
(2)若file存在,则检查依靠文件,是否存在更新,若存在更新则执行命令行,若没有更新则给出提示:
    make:'file' is up to date.
 
2.makefile中的宏定义及内部变量
 
宏定义:
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -wall -O -g
 
引用:
file:$(OBJS)
    $(CC) $(OBJS) -o file
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c file1.c  
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c file2.c
 
内部变量: 
$@:当前规则的目的文件名
$<:依靠列表中的第一个依靠文件
$^:整个依靠列表
 
file:$(OBJS)
    $(CC) $^ -o $@
file1.o:file1.c head.h
    $(CC) $(FLAGS) -c $< -o $@
file2.o:file2.c head.h
    $(CC) $(FLAGS) -c $< -o $@
 
"$(CC) $(FLAGS) -c $< -o $@"是隐含规则,可以不写,默认使用此规则
 
3.假象
 
假设一个项目要生成两个可执行文件file1和file2,这两个文件是相与独立的,则在makefile开始处:
 
all:file1 file2
 
make总是假设all要生成,去检查它的依赖文件
 
4.清除由make产生的文件
 
clean:
    rm *.o
    rm file
 
执行:
make clean
则会清除由make生成的*.o和file文件
如果有clean文件存在,则清除不会执行(因clean没有可依赖的文件,永远是最新的)
 
使用PHONY目标,避免同名文件相冲突,不会检查clean文件存在与否,都要执行清除操作
 
.PHONY : clean
clean:
    rm *.o
    rm file
 
5.makefile函数
 
搜索当前目录,生成由*.c结尾的文件列表,wildcard--函数名
SOURCE = $(wildcard *.c)
 
用%.o替换$(SOURCE)中的%.c文件
OBJS = $(patsubst %.c,%.O,$(SOURCE))
 
6.产生新规则
 
SOURCE = $(wildcard *.c)
depends:$(SOURCE)
    gcc -M $(SOURCE) > depends
 
(为每一个.c文件产生规则,c文件和相关头文件为依靠)
在makefile文件中:
include depends
 
7.一个有效的makefile文件
 
可以完成大部分我们所需要的依靠检查,不用做太多的修改就可用在大多数项目里
功能:搜索当前目录,寻找源码文件,放入SOURCE变量里,利用patsubst产生目标文件(*.o)
 
CC = gcc
CFLAGS = -Wall -O -g
 
SOURCE = $(wildcard *.c,*.cc)
OBJS = $(patsubst %.c,%.o,$(patsubst,%.cc,%.o,$(SOURCE)))
 
file:$(OBJS)
    $(CC) $^ -o $@
用默认规则产生目标文件(*.o)
 
(缺点:并未包含头文件,当头文件更新时,不能重新编译)
 
阅读(6453) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~