• make编写教程(一)


    1. make规则

    如果工程没有被编译过,则所有的c文件都要编译和链接

    如果工程的某几个c文件被修改,那么只编译被修改的文件,并链接目标程序

    如果工程的头文件被修改,需要编译引用了此头文件的c文件,并链接目标程序

    2. make的核心

    target:prerequisites

    command

    target: 为目标文件,执行文件或标签(伪目标)

    prerequisites: 生成target所需要的文件或目标

    comman: make所需要执行的命令

    example:
    
    PamXml: XmlConfig.o PamXml.o
    
      cc -o PamXml XmlConfig.o PamXml.o
    
    XmlConfig.o: XmlConfig.cpp XmlConfig.h
    
      cc -c XmlConfig.cpp
    
    PamXml.o: PamXml.cpp PamXml.h
    
      cc -c PamXml.cpp
    
    clean:
    
      rm PamXml XmlConfig.o PamXml.o

    目标文件(target)即是PamXml和中间目标文件XmlConfig.o,PamXml.o,依赖文件即是冒号后面的cpp文件,每个.o文件都有一组依赖文件。.o文件又是可执行文件PamXml的依赖文件。

    定义好依赖关系之后,后续的那一行为如何生成目标文件的操作系统指令,以tab键开头。make会比较依赖文件和目标文件的修改日期,以此来决定是否执行后续的操作系统命令。其中clean不是文件,只是一个动作名字,没有依赖文件,make不会自动执行后续定义的命令,如要执行需要显示指定。如:make clean.

    3. make的工作方式

    make在当前目录下寻找名为Make或make的文件;

    若找到,则会找文件中的第一个目标文件,并作为最终的目标文件;

    若目标文件不存在,或是依赖的.o文件的修改时间比此目标文件新,那么会执行后续定义的命令来生成该目标文件;

    再根据依赖性,生成.o文件,并最终生成可执行文件。

    make会一层又一层的去找文件的依赖关系,直到最终编译出第一个目标文件。

    4. make中使用变量

    上面的例子可以改写为:

    objs=XmlConfig.o PamXml.o
    
    PamXml: ${objs}
    
      cc -o PamXml ${objs}
    
    XmlConfig.o: XmlConfig.cpp XmlConfig.h
    
      cc -c XmlConfig.cpp
    
    PamXml.o: PamXml.cpp PamXml.h
    
      cc -c PamXml.cpp
    
    clean:
    
      rm PamXml ${objs}

    5. make的自动推导

    make可以根据一个.o文件自动推导出所依赖的.c文件,也能够推导出cc -c .c,则可以重新编写makefile

    objs=XmlConfig.o PamXml.o
    
    PamXml: ${objs}
    
      cc -o PamXml ${objs}
    
    XmlConfig.o: XmlConfig.h
    
    PamXml.o: PamXml.h

    .PHONY: clean
    clean:   rm PamXml ${objs}

    .PHONY表示clean是个伪目标文件。

    对于clean,可以写成 -rm PamXml ${objs},”-“表示如果某些文件出现问题,不用管继续下面的事。

  • 相关阅读:
    Python的网络编程[0] -> socket[1] -> socket 模块
    Python的网络编程[0] -> socket[0] -> socket 与 TCP / UDP
    Python的功能模块[4] -> pdb/ipdb -> 实现 Python 的单步调试
    Python的功能模块[3] -> binascii -> 编码转换
    Python的功能模块[2] -> abc -> 利用 abc 建立抽象基类
    Python的功能模块[1] -> struct -> struct 在网络编程中的使用
    Python的功能模块[0] -> wmi -> 获取 Windows 内部信息
    Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析
    Python的程序结构[7] -> 生成器/Generator -> 生成器浅析
    Python的程序结构[6] -> 迭代器/Iterator -> 迭代器浅析
  • 原文地址:https://www.cnblogs.com/sssblog/p/9718295.html
Copyright © 2020-2023  润新知