Makefile文件书写规则
Makefile文件描述了整个程序的编译,链接规则,并最终生成可执行文件。
Makefile文件有属于自己的书写规则,关键字以及函数等 (自我感觉和解释语言shell也有相似之处)基本规则(格式):
目标:依赖
<tab>命令
目标就是你要得到的文件名:如你想要的可执行文件,或者一个还没链接的 .o 类型的文件
依赖就是你要得到的目标文件所需要的文件
<tab>:固定的格式
命令:linux下的命令 如:gcc wangcan.c -o wangcan
下面举一个简单的小例子,就从HelloWorld 说起吧 (英语中少不了小华,计算机中少不了HelloWorld)
源文件:
/****hello.c*****/
#include<stdio.h>
int main()
{
printf("HelloWodld\n");
return 0;
}
对应的Makefife文件如下:
hello:hello.c
gcc hello.c -o hello
第一行的规则也可以写为:
hello:hello.c;gcc hello.c -o hello
#开头表示注释(这个和shell一样)
如果一行过长的时候可以选择使用 \ 将其划分为两行或者多行
我们也可以使用变量来代替Makefile中的目标,依赖,命令或者其它
例如:
object=hello.c
CC=gcc
SAFE= -Wall
hello:$(object)
$(CC) $(SAFE) $(object) -o hello
在使用时要记得形式$( ) (对于文本字符串)
Makefile中还有一种变量,叫做自动变量,主要有以下几种:$@ $< $^
$@ :代表当前规则的目录
$< :带表第一个依赖文件
$^ :代表所有文件列表,使用空格分隔
下面举一个稍微复杂的例子
如图显示各文件的关系:
<--------sort.o <-----------------------sort.c lib1.h
example <-----------<--------compute.o <---------------------compute.c
<--------main.o <-----------------------main.c lib2.h
Makefile文件如下
object=sort.o compute.o main.o
CC=gcc
SAFE=-Wall -g
example:$(object)
$(CC) $^ -o $@
sort.o:sort.c lib1.h
$(CC) $(SAFE) -c $< -o $@
compute.o:compute.c
$(CC) $(SAFE) -c $< -o $@
main.o:main.c lib2.h
$(CC) $(SAFE) -c $< -o $@
(另副我的GCC的版本: gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) )
注意:
变量主要用来代表文件列表,编译选项列表,程序参数列表,文件搜索目录列表以及编译输出目录列表
变量名的大小写是敏感的
单字符的变量可以直接使用$,不需要加括号 如:$W ,而$WANG 会被识别为 $(W)ANG