• C学习笔记-makefile


    除非最简单的项目,任何一个商业项目都会包含多个源代码,而且在编译的时候会有很长很复杂的指令,为了编译的简单可行,makefile由此而生,在编译时候直接输入make便会按照makefile里面的规则编译源代码。Android的源代码就是通过makefile管理的。

    make的工作原理

    make通过makefile得到编译规则,从而编译源文件

    makefile是以一个文本形式的脚本告诉make编译器如何以及怎么编译源代码,里面包含了编译规则

    makefile规则遵循以下通用格式

    target:dependency [dependency[···]]
        command
        command
        [···]
    

    每个command第一个字符必须是tab键,而不是空格键,不然make会报错并停止

    makefile的使用

    • makefile的简单使用
      makefile的文件名必须为makefile或者Makefile
      如果要用其他名称,使用make -f filename
      编写makefile文件如下所示,便可以通过make命令编译test.c文件了
    start:
        gcc -o test test.c
    
    • 进一步使用makefile
    start:test.o
        gcc -o test test.o
    test.o:
        gcc -o test.o -c test.c
    

    说明:target start后面的test.o代表其下的command依赖与test.o这个target。所以make先执行了test.o这个target下的command,如果存在test.o,那么makefile会去查看.c文件的修改时间,再决定编不编译.c文件

    • makefile完善
    start:test.o
        gcc -o test test.o
    test.o:
        gcc -o test.o -c test.c
    clean:
        rm -f test.o
    

    说明:增加clean标签,其后面的指令会在输入make clean时候执行

    • 在makefile中执行shell命令
    start:test.o
        gcc -o test test.o
        @echo '----------ok----------'
    test.o:
        gcc -o test.o -c test.c
    clean:
        rm -f test.o
    
    • 简化makefile
      为了简化编辑和维护makefile,可以在makefile中使用变量
    varname=some_text
    

    把变量用括号括起来,前面加$就可以引用该变量的值

    $(varname)
    

    按照惯例makefile的变量都是大写(只是习惯而已,不是必须的)

    CC=gcc
    SRCS=test.c
    OBJS=test.o
    EXEC=test
    
    start:test.o
        $(CC) -o $(EXEC) $(OBJS)
        @echo '----------ok----------'
    $(OBJS):
        $(CC) -o $(OBJS) -c $(SRCS)
    clean:
        rm -f $(OBJS)
    

    OBJS可以简化为以下形式,相当于把.c替换为.o

    OBJS=$(SRCS:.c=.o)
    
    • makefile完整版
    .SUFFIXES:.c .o
    
    CC=gcc
    SRCS=test.c
    OBJS=$(SRCS:.c=.o)
    EXEC=test
    
    start:test.o
        $(CC) -o $(EXEC) $(OBJS)
        @echo '----------ok----------'
    .c.o:
        $(CC) -o $@ -c $<
    clean:
        rm -f $(OBJS)
    

    模式规则

    .SUFFIXES:.c .o
    

    表示任何x.c文件与x.o关联,make定义了一条规则,任何x.o文件都从 x.c编译而来

    .c.o
    

    make定义了一些有用的预定义变量

    变量名 含 义
    $@ 规则的目标所对应的文件名
    $< 规则中的第一个相关文件名
    • makefile同时编译多个源文件
    .SUFFIXES:.c .o
    
    CC=gcc
    SRCS=test.c 
        a.c
    
    OBJS=$(SRCS:.c=.o)
    EXEC=test
    
    start:test.o
        $(CC) -o $(EXEC) $(OBJS)
        @echo '----------ok----------'
    .c.o:
        $(CC) -o $@ -c $<
    clean:
        rm -f $(OBJS)
    

    常见的make出错信息

    • No rule to make target ‘target’.Stop
      makefile中没有包含创建指定target所需要的规则,而且也没有默认规则可用

    • ‘target’ is up to date
      指定的target相关文件没有变化

    • command:Command not found
      make找不到命令,通常是因为命令被拼写错误或者不在$PATH路径下

  • 相关阅读:
    文件操作相关utils
    读取excel工具utils
    下载EXCEL文件Utils
    日期操作utils
    常用的utils
    坐标系转换Utils
    C# vs2019 CS0006 编译器错误CS1704
    C# 控制台形式 owin 添加WebApi 和Swagger
    Windows 下 Redis服务自动停止 处理
    Dotfuscator 混淆C# .Net代码 netcore
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664776.html
Copyright © 2020-2023  润新知