CC 表示我们的编译器名称,缺省值为cc.
CFLAGS 表示我们想给编译器的编译选项
LDLIBS 表示我们的在编译的时候编译器的连接库选项.(我们的这个程序中还用不到这个选项)
1.编译和链接
源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的ObjectFile.
2. .c.o:
gcc -c $<
这个规则表示所有的 .o文件都是依赖与相应的.c文件的.注意:其中的 .c.o ,其实是 和 %o:%c 等价
3.
一、Makefile 中的赋值方法
= 递归赋值 可以向后引用变量
:= 简单扩展 只能引用前面的变量
?= 如果没有赋值 则赋值一次
+= 在原来的基础上添加赋值变量
一个例子说明
- x = before
- y = $(x)
- x = later
- xx = before
- yy := $(xx)
- xx = later
- xxx = before
- xxx ?= later
- yyy ?= before
- yyy = later
- x += last
- all :
- @echo "x=" $(x)
- @echo "y=" $(y)
- @echo "xx=" $(xx)
- @echo "yy=" $(yy)
- @echo "xxx=" $(xxx)
- @echo "yyy=" $(yyy)
输出是
x= later last
y= later last
xx=later
yy=before
xxx=before
yyy=later
二、Makefile 自动变量
$@ 目标
$< 所以的依赖文件
$^ 第一个依赖文件
- test.o : test1.c test2.c
- @echo $@
- @echo $<
- @echo $^
结果为
test.o
test1.c test2.c
test1.c
三、Makefile中的常用函数
1、文本替换 函数 $(subst ma, wo ,hello world!!)
将hello world!! 中间的wo 替换成ma
结果为 hello marld!!
2、格式替换函数 $(patsubst %.c ,%.o , test.c test1.c test2.c)
将.c 的格式替换成.o
结果为 test.o test1.o test2.o
3、去掉空格函数 $(strip a b c)
结果 a b c
4、字符串查找函数
$(findstring a,a b c d)
在字符串a b c d 中查找 a ,找到就返回查到的值 ,否则为 " "
上面结果为 a
5、格式匹配过滤函数 $(filter %.c %.s , mod1.c mod2.o mod3.s mod4.h)
查找格式是%.c 和 %.s 的文件
结果为 mod1.c mod2.s
6、格式不匹配函数 $(filter-out %.c %.s, mod1.c mod2.o mod3.s mod4.h)
它的和filter相反
结果为 mod2.o mod4.h
7、$(sort hello world branck)
按字母排列
结果为 branck hello world
8 、抽取文件目录函数$( dir source/hello.c inc/hello.h mksh)
结果: source/ inc/ ./
9、抽取文件名函数 $(nodir source/hello.c inc/hello.h mksh)
结果: hello.c hello.h mksh
10、提取文件名后缀函数 $(suffix source/hello.c inc/hello.h mksh)
结果: .c .h
11、去除后缀名函数 $(basename sourc/hello.c inc/hello.h mksh)
结果: source/hello inc/hello mksh
12、添加后缀名函数 $(addsuffix .c ,hello fun)
结果: hello.c fun.c
13、添加前缀函数 $(addprefix source/ , mod1.c mod2.c mod3.c)
结果: source/mod1.c source/mod2.c source/mod3.c
14、格式匹配函数 $(wildcard source/*.c)
查找source 目录下所有.c 文件
15、格式匹配用法
SRCS = mod1.c mod2.c mod3.c
$(SRCS : %.c = %.o)
结果为mod1.o mod2.o mod3.o
16、目录循环搜索
dirs := dir1 dir2 dir3 dir4
files := $( foreach dir ,$(dirs) ,$(wildcard $(dir)/*)
查找 目录 dir1 dir2 dir3 dir4 目录下所有的文件。
17、在Makefile 中执行shell 脚本的方法
$(shell command)
SRCS := $(shell ls *.c)
则srcs 中所有的c程序。
四、Makefile 中的编译基础知识
1、编译时 指定头文件路径 用 -I
2、编译时 指定库路径用 -L 指定函数库名 用 -l (小写L )
3、在Makefile 指定宏定义 配置到程序中 -D
五、条件判断语句
1、ifdef/ifndf (param)
endif
# param 是否定义
2、ifeq/ifneq (a,b)
endif
# a和b是否相等
我想Makefile 的基础知识掌握这些就ok了,关键是应用
本文内容是转载的,原文http://blog.csdn.net/lostyears/article/details/23619211