• 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 命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。

  • 相关阅读:
    在配置文件“tsconfig.json”中找不到任何输入。指定的 “include“ 路径为“[“**/*“]”,“exclude“ 路径为[]
    JavaScript数据类型转换
    install flash_atten
    软件工程与计算总结(二十)软件交付
    OpenCV 中的轮廓-轮廓的层次结构
    【网络编程】多路转接之select、poll、epoll
    谨慎低调,一路通畅
    IDEA断点调试技巧,多张动图包教包会
    使用singularity本地部署wandb
    java基础运算符 之 赋值运算符
  • 原文地址:https://blog.csdn.net/weixin_43787492/article/details/128135806