Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287913
  • 博文数量: 57
  • 博客积分: 1764
  • 博客等级: 上尉
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-09 18:14
文章分类

全部博文(57)

文章存档

2012年(24)

2011年(33)

分类: LINUX

2011-11-18 11:37:42

    LINUX下工程编译必定会用到makeflie文件。因此,做为一个LINUX下的程序员,必须要掌握makefile文件的编写,至少能看懂。下面贴出几个makeflie文件模板,以供学习。
1.用户程序的makefile模板
    在项目的顶层目录中,建立src, include, out目录:
示例1:生成可执行文件
# filename: Makefile
#
# Authors:
# Version: 1.0

SOURCES= $(wildcard src/*.c)
OBJS = $(patsubst src/%.c, out/%.o, $(SOURCES))

TARGET = app
#PREFIX_BIN = /usr/local/bin
CC = gcc
CFLAGS = -g –Wall
INCLUDES = -I.
LIBS = -lpthread
LDFLAGS = -L.
 
vpath %.o out
vpath %.c src
vpath %.h include

.PHONY: all
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
 
%.o:%.c
$(CC) -c $< -o $@ $(INCLUDES) $(CFLAGS)
 
.PHONY:clean
clean:
rm -f $(OBJS)
rm -f $(TARGET)

    说明:
1)GNU make,当规则中只有一个依赖文件时,应该使用自动化变量 “$<”和“$@”代替出现在命令的依赖文件和目标文件。当有多个依赖文件的时候,可以用“$^”来引用所有的依赖文件。
2)模式规则:模式规则类似于普通规则。只是在模式规则中,目标名中需要包含有模式字符“%”(一个),包含有模式字符“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。规则的依赖文件中同样可以使用“%” ,依赖文件中模式字符“%”的取值情况由目标中的“%”来决定。
3)后缀规则:后缀规则是一种古老定义隐含规则的方式,在新版本的make中使用模式规则作为对它的替代,模式规则相比后缀规则更加清晰明了。在现在版本中保留它的原因是为了能够兼容旧的makefile文件。后缀规则有两种类型:“双后缀”和“单后缀”。后缀规则中不存在任何依赖文件,否则,将被作为普通规则处理。
4)变量的3种赋值方式:= := ?=。区别:=在执行的时候被展开,因此会递归展开;:=是定义的时候完成了展开;?=是条件赋值,只有当变量第一次赋值的时候,才会进行。
5)内置函数wildcard:在规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...)。在 Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
6)内置函数patsubst:文本替换函数。$(patsubst PATTERN,REPLACEMENT,TEXT)表示:
搜索“TEXT”中以空格分开的单词,将否符合模式“TATTERN”替换为“REPLACEMENT”。
7)关键字vpath:是一个设置文件搜索路径的方法,另一个是使用变量VPATH。它有三种用法:
1、vpath PATTERN DIRECTORIES
为所有符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。多个目录使用空格或者冒号(:)分开。类似上一小节的“VPATH”变量。
2、vpath PATTERN
清除之前为符合模式“PATTERN”的文件设置的搜索路径。
3、vpath
清除所有已被设置的文件搜索路径。 
注意:这里指定的路径仅限于在 Makefile 文件内容中出现的.h文件。并不能指定源文件中包含的头文件所在的路径(在.c源文件中所包含的头文件路径需要使用gcc 的“-I”选项来指定,可参考gcc的info文档)。

示例2:生成静态库
# filename: Makefile for static lib
#
# Authors:
# Version: 1.0

SOURCES= $(wildcard src/*.c)
OBJS = $(patsubst src/%.c, out/%.o, $(SOURCES))

TARGET = out/libapp.a
#PREFIX_BIN = /usr/local/bin

CC = gcc
AR = ar
CFLAGS = -g –Wall
INCLUDES = -I.
LIBS = -lpthread
LDFLAGS = -L.

vpath %.o out
vpath %.c src
vpath %.h include

.PHONY: all
all: $(TARGET)
$(TARGET): $(OBJS)
$(AR) –crsv $@ $^

%.o:%.c
$(CC) -c $< -o $@ $(INCLUDES) $(CFLAGS)

.PHONY:clean
clean:
rm -f $(OBJS)
rm -f $(TARGET)
说明:
 利用Ar命令来产生静态库。产生的静态库可以用ar –t来查看结构,用nm来查看符号。


阅读(1916) | 评论(2) | 转发(2) |
给主人留下些什么吧!~~

十七岁的回忆2011-11-20 19:12:55

我喜欢模板

☆彼岸★花开2011-11-19 19:24:51

支持LZ,收藏了~