Linux中Makefile用法及变量

一、介绍

1.Makefile概述

       (1)make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE            都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make

       (2)自动化编译:一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软          件开发的效率 

        (3)提高编译效率:再次编译,只编译修改的文件 

2.Makefile基本语法

        (1)Makefile基本结构 
         Makefile是Make读入的唯一配置文件 
          * 由make工具创建的目标体(target),通常是目标文件或可执行文件
          * 要创建的目标体所依赖的文件(dependency_file)
          * 创建每个目标体时需要运行的命令(command)
          * 注意:命令行前面必须是一个”TAB键”,否则编译错误为:*** missing separator.  Stop.
         Makefile格式
         target  :   dependency_files
           command
         例子
            hello.o :  hello.c hello.h
            gcc  –c  hello.c  –o  hello.o

3.具体编写makefile文档如下:

        Linux中Makefile用法及变量_第1张图片

        注:上面都是建立在所有文件都有的情况下,也可以不写makefile文档,直接编译即可

4.然后执行make即可如下:

        Linux中Makefile用法及变量_第2张图片

        注:自己定义的头文件要以”“为基准,然后.c文件中也保持一致”“

5.注意make只会编译修改后的文件,以及删除可执行文件.o,在执行make会重新生成的

        Linux中Makefile用法及变量_第3张图片

6.在makefile文件中末尾加入clean,如下:

        Linux中Makefile用法及变量_第4张图片

        注:makefile执行时候,只执行一行的目标:依赖,后面就不执行了,所以要把最终的test:          add.o...放在第一行,此时生成test的文件需要依赖三个.o文件,所以要去寻找一下当前3个文          件,如果有的话就追溯到.o文件哪来的,进而就执行后面的文件了,这也解释了为什么要把            最终文件放在第一行的原因了

        运行时,要在make后面加入clean后如下:

        Linux中Makefile用法及变量_第5张图片

7.如果该目录下存在相同文件的clean怎么办?

        (1)vim Makefile,修改里面的文件加入目标:依赖关系

                Linux中Makefile用法及变量_第6张图片

        (2)然后就可以使用make clean:

                Linux中Makefile用法及变量_第7张图片

二、Makefile创建变量的目的

1.创建目的的目的

       *用来代替一个文本字符串
       * 系列文件的名字  
       * 传递给编译器的参数 
       * 需要运行的程序 
       * 需要查找源代码的目录 
       * 你需要输出信息的目录  
       * 你想做的其它事情。     

2.自定义变量

        x=a 变量在声明时需要给予初值

        $(x)或${x} 取值

        如果你要使用真实的$字符,那么你需要$$来表示

3.一个自定义变量的小例子,就是基于上面的makefile文件中的来改写的

        Linux中Makefile用法及变量_第8张图片

        * 将之前的字符串给换成自定义的变量即可

        *最后执行make发现没有报错

        Linux中Makefile用法及变量_第9张图片

4.赋值的操作:

        ?=:前面定义赋值过了就不在赋值了

        :=:前面赋值过了,在赋值定义一次

        +=:追加赋值,在旧值上加上新值

三、自动变量

        (1)指令:

            $*      不包含扩展名的目标文件名称
            $+      所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件
            $<      第一个依赖文件的名称
            $?      所有时间戳比目标文件晚的的依赖文件,并以空格分开
            $@    目标文件的完整名称
            $^      所有不重复的目标依赖文件,以空格分开
            $%     如果目标是归档成员,则该变量表示目标的归档成员名称

        (2)代码如下:

        Linux中Makefile用法及变量_第10张图片

        注:如果不想要不想要显示echo那一行指令,就在echo前加入@

        (3)可以将makefile文件里进一步的替换:

        Linux中Makefile用法及变量_第11张图片

四、Makefile的隐含变量

        (1)保存命令的隐含变量

                AR:库文件维护程序的名称

                AS:汇编程序的名称

                CC:C编译器的名称

                CPP:C预编译器的名称

                CXX:C++编译器的名称

                FC:FORTRAN编译器的名称

                RM:文件删除程序的名称

        (2)隐含命令所用到的选项

                ARFLAGS:库文件维护程序的选项

                ASFLAGS:汇编程序的选项

                CFLAGS:C编译器的选项

                LDFLAGS:链接器的选项

                CPPFLAGS:C预编译的选项

                CXXFLAGS:C++编译器的选项

                FFLAGS:FORTRAN编译器的选项

        (3)案例如下:

                Linux中Makefile用法及变量_第12张图片

                注:-c -g -wall ,-g是可以gdb调试,-wall是可以报错,也可以指定头文件,比如:-I                 include(include当前目录下,如果不在当前目录就用绝对,/home/linux/Makefile/include)

五、Makefile的条件判断

        (1)ifeq:判断是否相等

        (2)ifneq:判断是否不相等

        (3)ifdef:判断是否定义过,定义就是是否给赋值

        (4)ifndef:判断是否未定义过

        (5)案例如下:

        Linux中Makefile用法及变量_第13张图片

        注:ifeq与endif匹配,或者ifneq与else、endif相配对

六、Makefile函数

        (1)Makefile函数

                基本语法:

                        $() or ${}

                        例如:$(wildcard PATTERN)

                        功能:列出当前目录下所有符合模式"PATTERN"格式的文件名

                        返回:空格分割的、存在当前目录的所有符合模”PATTERN“的文件名

                        说明:”PATTERN“使用shell可识别的通配符,包括”?“(单字符)、(多字符)等

        (2)案例:$(wildcard *.c)返回值为当前目录下所有.c源文件列表

                Linux中Makefile用法及变量_第14张图片

        (3)$(patsubst ,,)

                名称:模式字符串替换函数

                功能:查找中的单词(单词以:”空格“、”Tab“、”回车“、”换行“分隔)是否符合模                        式,如果匹配的话,则以替换。这里,可以包括通配                  符%,表示任意长度的字串。如果中也包含%,那么,中的                  这个%将是中的%所表示的字串。(可以用\来转义,以\%来表示真实含义的%)

                返回:函数返回被替换过后的字符串

                例子:$(patsubst %.c,%.o,x.c.c bar.c)

                        把字串x.c.c bar.c 符合模式%.c的单词替换成%.o,返回结果是x.c.o、bar.o

        (4)例子如下:

                Linux中Makefile用法及变量_第15张图片

        (5)Makefile自定义函数

                示例:$(call ,,...)

                Linux中Makefile用法及变量_第16张图片

                

                

你可能感兴趣的:(linux,运维,服务器)