Makefile浅谈

1、configure文件

 configure文件可以自动配置源代码以适应各种不同平台上Linux系统的特性,根据系统参数及环境产生合适的Makefile文件和C的头文件,让源代码可以很方便地在不同的平台上被编译

2、gcc常用选项

-Idir 将头文件的搜索路径扩大,包含dir目录
-Ldir 将链接时使用的链接库搜索路径扩大,包含dir目录。gcc都会优先使用共享程序库
-static 仅选用静态程序库进行链接,如果一个目录中静态库和动态库都存在,则仅选用静态库
-g 包括调试信息
-On 优化程序,程序优化后执行速度会更快,程序的占用空间会更小。通常gcc会进行很小的优化,优化的级别可以选择,即n。最常用的优化级别是2
-Wall 打开所有gcc能够提供的、常用的警告信息

3、Makefile文件

Make工具最主要也是最基本的功能就是通过Makefile文件来描述源程序之间的相互关系并自动维护编译工作,make如果没有“-f”参数,则系统将默认当前目录下名为makefile或者Makefile的文件为描述文件。在Linux系统中,GUN make工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜素makefile文件

4、伪目标

如果命令行中没有指定伪目标,则系统默认“target”指向描述文件中第一个伪目标,一般第一个伪目标为“all”

clean伪目标,可用来清除编译过程中的中间文件

distclean,除删除编译过程中产生的中间文件外,还可以将生成的Makefile文件一并删除

install   可以将生成的可执行文件和其他相关的文件安装到“prefix”选项所定义的安装路径,即通常意义上的“安装”软件

uninstall   可以将可执行文件和其他相关的文件从安装路径上删除,即通常意义上的“卸载”软件

5、Makefile中的预定义变量

变量名 含义 默认值
CC C语言编译器的名称 cc
RM 删除文件程序的名称 rm -f
CFLAGS C语言编译器的编译选项 无默认值
 6、Makefile中的自动变量

变量 含义
$< 表示依赖项中第一个依赖文件的名称
$@ 目标项中目标文件的名称
$^ 依赖项中,所有不重复的依赖文件,这些文件之间以空格分开
7、内置规则

后缀规则:定义如何将一个具有特定文件名后缀的文件(如.c文件)转换成为具有另一种文件名后缀的文件(如.o文件)

模式规则:模式规则看起来非常类似于正则规则,但在目标名称前面多了一个“%”号

自动推导规则:使用命令make编译扩展名为.c的C语言文件的时候,源文件的编译规则不用明确给出。这是因为make进行编译的时候会使用一个默认的编译规则,按照默认规则完成对.c文件的编译,生成对应的.o 文件。


hello.c

int main(void)
{
      printf("hello world") ;
      return 0 ;
}

Makefile

hello : hello.c
         gcc -o hello hell.c
Makefile 改进  把编译和链接分开
hello : hello.o
          gcc -o hello hello.o          链接
hello.o : hello.c
          gcc -o hello.o -c hello.c     编译  -c表示只编译不链接
Makefile再次改进,使用模式匹配      
hello : hello.o
        gcc -o $@ $^        //目标可以用$@表示,所有的依赖可以用$^表示     gcc -o hello hello.o
%.o : %.c                   //hello.o : hello.c
        gcc -o $@ -c &<     //目标可以用$@表示,第一个依赖可以用$<表示      gcc -o hello.o -c hello.c 
clean : 
        rm *.o hello

Makefile再次改进,使用变量

CFLAGS = -O2
OBJS = hello.o
TARGET = cacu
$(TARGET) : $(OBJS)
        $(CC) -o $@ $^ $(CFLAGS)
$(OBJS) : %.o : %.c
        $(CC) -o $@ -c $<
clean:
        $(RM) $(TARGET) $(OBJS)







你可能感兴趣的:(Makefile浅谈)