• Makefile


    一、不使用Makefile时 linux 编译的困难

    • 不能像VS那样,一键编译整个项目
    • 只编译修改过的文件,而不是重新编译整个工程

    二、make 和 Makefile

    1、make

    make是一个命令工具
    是一个解释makefile中指令的命令工具

    2、Makefile

    Makefile就是一组规则,它指导make程序的运行

    Makefile 文件中描述了整个工程所有文件的编译顺序,编译规则。

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

    Makefile有自己的书写格式、关键字、函数。

    编写Makefile的好处是能够使用一行命令来完成整个工程的“自动化编译”

    三、Makefile 的编写规则

    
    target ... : prerequisites ...
        command
        ...
        ...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    target

    可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。
    
    • 1

    prerequisites

    生成该target所依赖的文件和或target
    
    • 1

    command

    生成该target要执行的命令(任意的shell命令)
    
    • 1

    这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
    说白一点就是说:prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

    这就是makefile的规则,也就是makefile中最核心的内容。

    四、Makefile的文件名

    默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。

    当然,你可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.AIX” “Makefile.se” 等,如果要指定特定的Makefile,你可以使用make的 -f 和 --file 参数,如: make -f Make.Linux 或 make --file Make.AIX 或 make -f Makefile.se

    五、Makefile 特殊

    静态模式

    objects = foo.o bar.o
    
    all: $(objects)
    
    $(objects): %.o: %.c
        $(CC) -c $(CFLAGS) $< -o $@
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面的例子中,指明了我们的目标从$object中获取, %.o 表明要所有以 .o 结尾的目标,也就是 foo.o bar.o ,也就是变量 $object 集合的模式,而依赖模式 %.c 则取模式 %.o 的 % ,也就是 foo bar ,并为其加下 .c 的后缀,于是,我们的依赖目标就是 foo.c bar.c 。而命令中的 $< 和 $@ 则是自动化变量, $< 表示第一个依赖文件, $@ 表示目标集(也就是“foo.o bar.o”)。于是,上面的规则展开后等价于下面的规则:

    foo.o : foo.c
        $(CC) -c $(CFLAGS) foo.c -o foo.o
    bar.o : bar.c
        $(CC) -c $(CFLAGS) bar.c -o bar.o
    
    • 1
    • 2
    • 3
    • 4

    伪目标

    clean:
        rm edit $(objects)
    
    • 1
    • 2

    更为稳健的做法是:

    .PHONY : clean
    clean :
        -rm edit $(objects)
    
    • 1
    • 2
    • 3

    前面说过, .PHONY 表示 clean 是一个“伪目标”。而在 rm 命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。

  • 相关阅读:
    MySQL:基础操作(1)
    开发一款提高效率工作的命令行程序
    C语言程序设计——输入三个整数x,y,z,请把这三个数由小到大输出
    【ETL工具】Datax-ETL-SqlServerToHDFS
    2022 年最新【Java 经典面试 800 题】面试必备,查漏补缺;多线程 +spring+JVM 调优 + 分布式 +redis+ 算法
    Go有哪些特殊的语言特性?
    Python+Appium实现自动化测试
    navicat的安装和配置教程
    锐捷Smartweb管理系统 默认开启Guest账户漏洞
    Leetcode 652. 寻找重复的子树
  • 原文地址:https://blog.csdn.net/weixin_43787492/article/details/128135806