Makefile总结

    xiaoxiao2025-12-04  3

    Makefile

     

    Part 1

    1.makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译甚至更复杂的操作。

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

     

    visual c++ 中的命令为nmake

    Linux下的GUNmake

     

    Part 2

    1.无论是C、C++、还是pas, 首先要把源文件编译成中间代码文件,在Windows 下也就是 .obj 文件,UNIX 下是 .o 文件,即 Object File,这个动作叫做编译(compile)。

    编译时,编译器只检查程序语法和函数、变量是否被声明

    2.然后再把大量的Object File 合成执行文件,这个动作叫作链接(link)。

    链接程序时,链接器会在所有的Object File中寻找函数的实现

     

    Part 3

    3.Makefile的规则是

    1)如果这个工程没有编译过,那么我们的所有C 文件都要编译并被链接。

    2)如果这个工程的某几个C 文件被修改,那么我们只编译被修改的C 文件,并链接目标程。

    3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C 文件, 并链接目标程序。

    4.Makefile规则:

    target... : prerequisites...

    command

     

    目标...  :依赖文件...

    命令

     

    如果prerequisites中有一个及以上的文件比target文件要新的话,command所定义的命令就会被执行。

    命令必须要以[Tab]键开始。

     

    5.makefile中使用变量

    可以声明一个变量,来代替多次重复使用的项目

    如:

    objects = main.o kbd.o command.o display.o \

    insert.o search.o files.o utils.o

     

    edit : $(objects) 

    cc -o edit $(objects)

     

    使用时,使用$(objects) 即可

    6.自动推导

    可以省略依赖文件中的.c和命令中cc -c whaerver.c。

    makefile会自动识别并推导命令

     

    7.清空文件目标的规则

    稳健的做法是:

    .PHONY : clean

    clean :

    -rm edit $(objects)

    其中:

    l rm命令前的-的意思是:也许某些文件出现问题,但不要管,继续做后面的事。

    l .PHONY : clean显示地说明了clean为一个 “伪目标”;

     

    Part 4

    1.Makefile的组成

    Ø 显示规则

    Ø 隐晦规则

    Ø 变量的定义

    Ø 文件指示

    Ø 注释

    2.Makefile的文件名

      make命令会在当前目录中寻找makefile文件

      文件名最好为Makefile

    3.引用其他的Makefile

      include foo.make a.mk b.mk c.mk

      先在当前工作目录下寻找,再在/usr/local/bin或者/usr/include中寻找。

    也可以指定查找的目录:    -I <目录>

     

    4.makefile的工作方式

    1) 读入所有的Makefile。

    2) 读入被include的其它Makefile。

    3) 初始化文件中的变量。

    4) 推导隐晦规则,并分析所有规则。

    5) 为所有的目标文件创建依赖关系链。

    6) 根据依赖关系,决定哪些目标要重新生成。

    7) 执行生成命令。

     

    Part 5

    1.cc 命令

     cc 类似于gcc

     -c 表示编译产生(*.obj)文件,而不链接为可执行文件

     -o 表示允许用户指定输出文件的文件名(与gcc -o类似)

    2.如果命令过长,可以用\作为换行符

    3.通配符的使用

      ~  :如果是“~/test”,这就表示当前用户的$HOME目录下的test目录。而“~hchen/test”则表示用户hchen的宿主目录下的test目录。

      *  :表示匹配一个字符串。

      ? :表示匹配一个字符。

      注意:通配符用于变量的时候不会展开,必须使用特殊的写法

    4.文件搜寻

    vpath %.h  ../headers    

    在“../headers”中搜索.h为结尾的文件

    5.伪目标

    为了避免和文件重名的情况,我们使用.PHONY来显示地指明一个目标为伪目标

    .PHONY:clean

    只要有这个声明,不管是否有“clean”文件,都要运行clean这个目标

    同时,我们可以利用伪目标的特性,一次生成多个可执行文件

    6.多目标?????

    7.静态模式??????

    8.自动生成依赖性????

    编译器-M选项(gcc为-MM)会自动寻找标准头文件

          gcc -MM main.c的输出是:

          main.o: main.c defs.h

     

    转载请注明原文地址: https://ju.6miu.com/read-1304588.html
    最新回复(0)