• make工程管理器


    1.概述

    大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生。

    • make可以自动识别文件时间戳,只处理修改的文件;
    • make动作的依据是makefile文件

    2 makefile基本结构

    makefile通常包含:

    • target:需要make创建的目标体,通常为目标文件和可执行文件
    • dependency_file:target依赖的文件
    • command:创建target时需要执行的命令,此行必须用Tab开头
    target:dependency_files
        command /* 该行必须以Tab键开头,否则报错 */
    

    举例说明:

    #The simplest example
    hello.o: hello.c hello.h
        gcc -c hello.c -o hello.o
    

    使用make target的形式:

    make hello.o
    

    一个稍微复杂一点的例子:

    • 有3个target,david、kang.o、yul.o,其中david依赖后面两个target
    • make david时,会执行下面的cmd,会一级一级向下检查
    david:kang.o yul.o
        gcc kang.o bar.o -o david
    kang.o:kang.c kang.h head.h
        gcc -Wall -O -g -c kang.c -o kang.o
    yul.o:bar.c head.h
        gcc -Wall -O -g -c yul.c -o yul.o
    

    3 makefile变量

    3.1 变量

    挨个输入文件和编译选项比较麻烦,makefile支持用变量代替target、depandence、cmd以及其他部分。

    分两种:

    • 递归展开方式 VAR=var,在引用处展开;需注意对自己的递归可能导致无限循环
      • 例如 CFLAGS = $(CFLAGS) -O,就会无限循环
    • 简单扩展方式 VAR := var,在定义处一次性展开

    用变量重写上面的例子

    OBJS = kang.o yul.o
    CC = gcc
    CFLAGS = -Wall -O -g
    
    david:$(OBJS)
        $(CC) kang.o bar.o -o david
    kang.o:kang.c kang.h head.h
        $(CC) $(CFLAGS) -c kang.c -o kang.o
    yul.o:yul.c yul.h
        $(CC) $(CFLAGS) -c yul.c -o yul.o
    

    3.2 预定义变量

    • AR,库文件维护
    • AS,会便器
    • CC,C编译器
    • CPP,C预编译器
    • CXX,C++编译器
    • FC,Fortan编译器
    • RM,文件删除
    • ARFLAGS
    • ASFLAGS
    • CFLAGS
    • CPPFLAGS
    • CXXFLAGS
    • FFLAGS

    3.3 自动变量

    target和depandence已经出现了文件,后面可用自动变量替代这些文件,起到简化makefile的目的。

    • $* : 不包含扩展名的target文件名称
    • $+ : 所有的depandence文件,以空格分开,可能有重复
    • $< : 第一个depandence文件
    • $? : 所有时间戳比target晚的depandence文件
    • $@ : target文件的完整名称
    • $^ : 所有的depandence文件,以空格分开,不重复
    • $% : 如果目标文件是归档文件,则表示目标的归档成员名称

    用自动变量重写刚才的例子:

    OBJS = kang.o yul.o
    CC = gcc
    CFLAGS = -Wall -O -g
    
    david:$(OBJS)
        $(CC) $^ -o $@
    kang.o:kang.c kang.h head.h
        $(CC) $(CFLAGS) -c $< -o $@
    yul.o:yul.c yul.h
        $(CC) $(CFLAGS) -c $< -o yul.o
    

    4 makefile规则

    上述makefile写的比较全面,即显性方式。还支持隐形方式去掉,简化一些代码

    4.1 隐含规则

    只要告诉make目标文件,make会自动搜索隐含规则完成编译。
    上述makefile可以进一步简化,省掉了最后两行,依赖中的kang.o yul.o,make会自动搜索kang.c和yul.c
    隐含规则只能查找相同文件名,例如test.o会查找test.c

    OBJS = kang.o yul.o
    CC = gcc
    CFLAGS = -Wall -O -g
    
    david:$(OBJS)
        $(CC) $(CFLAGS)  $^ -o $@
    

    常用的隐含规则:

    • C编译,.c编程.o:$(CC) -c $(CPPFLAGS) $(CFLAGS)
    • C++编译,.cc或.c编程.o:$(CC) -c $(CPPFLAGS) $(CXXFLAGS)
    • Pascal编译,.p编程.o:$(PC) -c $(PFLAGS)
    • Fortan编译,.r编程.o:$(FC) -c $(FFLAGS)

    4.2 模式规则

    定义相同处理规则的多个文件,文件必须用%开头
    上述可改写为:

    OBJS = kang.o yul.o
    CC = gcc
    CFLAGS = -Wall -O -g
    
    david:$(OBJS)
        $(CC) $(CFLAGS)  $^ -o $@
    %.o:%.c
        $(CC) -c $(CFLAGS)  $< -o $@
    

    5 make管理器的使用

    • -C dir : 读入指定目录下的makefile,变换目录
    • -f file : 读入file,作为makefile文件
    • -i : 忽略所有命令执行错误
    • -I dir : 指定被包含的makefile所在目录
    • -n : 只打印命令,但不执行
    • -p : 显示make变量数据库和隐含规则
    • -s : 在执行命令时不显示命令
    • -w : 如果make改变目录,则打印当前目录

    附录1:gcc常用参数

    • -c :只编译,不链接,生成.o文件
    • -S :只编译,不汇编,生成汇编文件
    • -E :只进行预处理
    • -g :包含调试信息
    • -o file : 将file文件指定为输出文件
    • -v : 打印编译过程和版本
    • -I dir :在头文件搜索目录中增加dir目录
  • 相关阅读:
    Java MQTT 客户端之 Paho
    Spring Security + JJWT 实现 JWT 认证和授权
    MinIO
    Spring Boot 实现看门狗功能 (调用 Shell 脚本)
    Canal Admin
    canal
    浅尝 Elastic Stack (五) Logstash + Beats + Kafka
    养鸡场下蛋记
    涛声依旧
    原创:矩阵论学习心得
  • 原文地址:https://www.cnblogs.com/liuwanpeng/p/8119332.html
Copyright © 2020-2023  润新知