Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183358
  • 博文数量: 38
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 372
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-05 19:39
文章分类

全部博文(38)

文章存档

2011年(1)

2010年(2)

2009年(2)

2008年(33)

我的朋友

分类: LINUX

2008-04-08 19:58:07

make命令的flag选项如下:
-C DIR  在读取makefile文件之前改变到指定目录中去
-f FILE 以指定FILE文件作为makefile文件
-I 忽略所有的命令错误
-h 显示所有的make选项
-I DIR 当包含其他的makefile文件时,可利用该选项指定搜索目录
-n 只打印要执行的命令,但不执行这些命令
-s 在执行这些命令时不显示命令
-w 在处理makefile文件之前和之后,显示文件目录
-p 显示make变量数据库和隐含规则

makefile 文件的基本结构
1.需要由make命令来创建的项目,通常是目录文件和可执行文件。通常使用“ 目标(target)”一词来表示要创建的项目。
2.要创建的项目依赖于哪些文件
3.创建每个项目时需要运行的命令,命令行的首字母必须为TAB制表符
例如:
#This makefile just is a example
#The following lines indicate how test.o depends
#test.c and test.h,and how to creat teat.o
test.o:test.c test.h
    gcc -c -g test.c

makefile文件的变量
makefile有许多便于表达依赖关系以及建立目标的命令特色,其中之一就是变量或宏的变量能力
CC = gcc
CCFLAGS = -D_DEBUG -g -m486
test.o: test.c test.h
    $(CC) -c $(CFLAGS)tset.c

GNU       make 的主要预定义变量:
$*        不包含扩展名的目标文件名称
$+        所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$<        第一个依赖文件的名称
$?      所有依赖文件,以空格分开,这些依赖文件的修改日期比目标创建日期晚
$@      目标的完整名称
$^      所有依赖文件,以空格分开,不包括重复依赖文件
$%      如果目标是归档成员,则该变量表示目标的归档成员名称
AR      归档维护程序名称,默认值ar
ARFLAGS   归档维护程序选项
AS      汇编程序的名称,默认值as
ASFLAGS   汇编程序的选项
CC      C编译器的名称,默认值cc
CCFLAGS   C编译器的选项
CPP      C预编译器的名称,默认值为$(CC)-E
CPPFLAGS  C预编译器的选项
CXX      C++编译器的名称,默认值g++
CXXFLAGS  C++编译器的选项

我更加倾向于使用模式规则,类似于正则规则,但是前面多了一个%,同时可用来定义目标和依赖文件之间的关系
%.c:%.o
$(CC)$(CCFLAGS)-c -o $@$<
makefile的函数使用时,用一个”$”符号和左括号,函数名,空格后跟一系列又逗号分隔的参数,然后用右括号结束
来看一个例子:
              CC = gcc

,函数名,空格后跟一系列又逗号分隔的参数,然后用右括号结束
来看一个例子:
              CC = gcc

              XX = g++
              CFLAGS = -Wall -O –g

              TARGET = ./helloworld

              %.o: %.c

                     $(CC) $(CFLAGS) -c $< -o $@

              %.o:%.cpp

                     $(XX) $(CFLAGS) -c $< -o $@

 

              SOURCES = $(wildcard *.c *.cpp)
              OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))

              $(TARGET) : $(OBJS)
                     $(XX) $(OBJS) -o $(TARGET)

                     chmod a+x $(TARGET)

clean:

       rm -rf *.o helloworld

函数1:wildcard

       产生一个所有以 '.c' 结尾的文件的列表。

       SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里。

函数2:patsubst

       匹配替换,有三个参数。第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。

OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。

%.o: %.c

       $(CC) $(CFLAGS) -c $< -o $@

       这几句命令表示把所有的.c,.cpp编译成.o文件。

       这里有三个比较有用的内部变量。$@ 扩展成当前规则的目的文件名, $< 扩展成依靠       列表中的第一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。

       chmod a+x $(TARGET)表示把helloworld强制变成可执行文件。
              XX = g++
              CFLAGS = -Wall -O –g

              TARGET = ./helloworld

              %.o: %.c

                     $(CC) $(CFLAGS) -c $< -o $@

              %.o:%.cpp

                     $(XX) $(CFLAGS) -c $< -o $@

 

              SOURCES = $(wildcard *.c *.cpp)
              OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))

              $(TARGET) : $(OBJS)
                     $(XX) $(OBJS) -o $(TARGET)

                     chmod a+x $(TARGET)

clean:

       rm -rf *.o helloworld

函数1:wildcard

       产生一个所有以 '.c' 结尾的文件的列表。

       SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里。

函数2:patsubst

       匹配替换,有三个参数。第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。

OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。

%.o: %.c

       $(CC) $(CFLAGS) -c $< -o $@

       这几句命令表示把所有的.c,.cpp编译成.o文件。

       这里有三个比较有用的内部变量。$@ 扩展成当前规则的目的文件名, $< 扩展成依靠       列表中的第一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。

       chmod a+x $(TARGET)表示把helloworld强制变成可执行文件。

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