美文网首页编译构建辅助工具
makefile笔记-规则测试

makefile笔记-规则测试

作者: Mark_Liu | 来源:发表于2019-06-03 17:59 被阅读0次

    以这个简单的makefile文件为列

    # 生成可执行文件main
    main:main.o
        cc -o main main.o
    # 生成main.o对象文件
    main.o:main.c
        cc -c main.c
    # 清除指令,删除执行过程中生成的文件
    
    # 伪目标
    .PHONY:clean
    
    clean:
        rm main main.o
    

    规则格式

    target...:prerequisites...
    <tab> command
    
    • target :目标
    • prerequisites:依赖文件
    • command:命令

    1.探究target和prerequisite的作用

    1. 执行 make main.o
      • 运行日志 cc -c main.c
      • 生成了main.o 文件
    2. 再次执行make mian.o
      • 运行日志'main.o' is up to date,已经是最新了的
    3. 修改main.c文件后
      • 运行日志 cc -c main.c
      • 生成了main.o 文件
    4. 修改makefile文件为
    main.o:
        cc -c main.c
    
    1. 执行 make mian.o
      • 运行日志 cc -c main.c
      • 生成了main.o 文件
    2. 执行 make mian.o
      • 运行日志 cc -c main.c
      • 生成了main.o 文件
        6.修改makefile文件为
    main:main.c
        cc -c main.c
    
    • 执行结论和 4,5 的结果一样

    结论

    1. 当target为目标生成文件的名称时,makefile会将目标名称对应的文件和依赖的文件进行最后修改时间对比,来判断是否需要执行命令生成新的文件,避免重复执行
    2. 不设置依赖文件或target名不是目标文件名 ,不影响target指令的执行

    2.伪目标的问题

    一些博客上说伪目标的做用是不生成目标文件

    以上面clean目标为列

    • .PHONY:clean 代码时,执行make clean
      • 执行了删除指令,没有生成clean文件
    • 删除.PHONY:clean代码后,执行命令,也没有clean文件

    结论

    1. 伪目标没有什么作用
    2. target名称本身不会产生文件,不是目标文件名时,仅充当方法名的作用

    3.关于隐晦规则

    1. 删除一下代码
    main.o:main.c
        cc -c main.c
    
    1. 执行 make
      • 日志cc -c -o main.o main.c
      • 日志cc -o run main.o

    结论
    C 编译过程中,有.o文件依赖时,如果没有显性规则生成.o文件,makefile会自动补全.o 的生成命令


    ps:如有问题 欢迎交流 愿与君共勉


    相关文章

      网友评论

        本文标题:makefile笔记-规则测试

        本文链接:https://www.haomeiwen.com/subject/kclhxctx.html