Make编译学习笔记(一)Makefile基础

来源:互联网 发布:美国ela数据 编辑:程序博客网 时间:2024/05/22 18:16

在工程中通常有许多源文件并按类型放在若干个子目录中,Makefile 可以定义一系列的编译规则,写好后只需要一个 make 命令就可以对整个工程自动编译了。Makefile 文件能按一下规则进行编译

  1. 如果整个工程没编译,那么所有的源文件都要编译并链接。
  2. 如果修改了部分源文件 ,那么只编译链接修改的文件。
  3. 如果改变了引用的头文件,那么只编译链接引用头文件的文件

Makefile文件通常和源文件放在同一个目录下,文件名一般为 Makefile,Makefile 文件又若干规则组成,来个例子:

CC = gccmain: main.o insert.o search.o     $(CC) -o main main.o insert.o search.omain.o: main.c    $(CC) -c main.cinsert.o: insert.c    $(CC) -c insert.csearch.o: search.c    $(CC) -c search.cclean:    rm *.o    rm main

Makefile 文件中主要包含5个内容:显示规则、隐含规则、变量定义、文件指示和注释

CC = gcc是声明变量
$(CC)是使用变量
使用时在变量前加上 $,通常再用 ( ) 或 { } 把变量扩起来,如果使用真实的 $,用 $$ 表示。
Makefile 中的变量和 C 语言中的宏特别类似,代表了一个字符串,执行时在使用的地方原模原样的展开,与 C 语言中不同的是 Makefile 中的变量能改变值。变量的命名规则同 C 语言。

main: main.o insert.o search.o    $(CC) -o main main.o insert.o search.o

这是条显示规则,表示如果条件更新了目标会执行一次命令进行更新。
main是目标
main.o insert.o search.o是条件
$(CC) -o main main.o insert.o search.o是命令,命令必须以Tab开头,make会以UNIX的标准Shell来执行命令

Makefile 中约定了一些使用频率非常高的东西作为隐含规则,上面的 Makefile 文件如果用了隐含规则就变成了这样

CC = gccmain: main.o insert.o search.o     $(CC) -o main main.o insert.o search.oclean:    rm *.o    rm main

可以看出 Makefile 中的隐含规则会自动进行推导,把 .o 的后缀替换成 .c,所以

main.o: main.c    $(CC) -c main.cinsert.o: insert.c    $(CC) -c insert.csearch.o: search.c    $(CC) -c search.c

这几条规则就没必要写了。
默认的后缀列表是:.out , .a , .ln , .o , .c , .cc , .C , .p , .f , .F , .r , .y , .l , .s , .S , .mod , .sys , .def , .h , .info , .dvi , .tex , .texinfo , .texi , .txinfo , .w , .ch , .web , .sh , .elc , .el

1 0